C:访问uint16_t数字中的各个位?

时间:2012-03-30 20:33:17

标签: c bit

  

可能重复:
  C printing bits

假设我有一个类似于uint16_t的数字:

uint16_t myVar = 0x3A44;

我想从myVar打印二进制值,如果是0x3A44,我怎么能迭代访问并打印每一位?

将它视为一个位阵列?

8 个答案:

答案 0 :(得分:5)

整数有效地是位数组。你可以循环遍历数字的值,将值向右移动16次。

#include <stdio.h>
#include <stdint.h>

int main() {
    uint16_t x = 0xFF00;
    for (int i = 0; i < 16; i++) {
        printf("%d", (x & 0x8000) >> 15);
        x <<= 1;
    }
    printf("\n");
}

结果:

1111111100000000

答案 1 :(得分:2)

while (myVar != 0) {
  printf("%c", (myVar & 0x8000) == 0 ? '0' : '1');
  myVar <<= 1;
}
printf("\n");

答案 2 :(得分:2)

使用以下内容:

for (i = 15; i >= 0; --i) {
    printf("%d", (bool) (myVar & (1U << i)));
} 

答案 3 :(得分:1)

嗯,改变的递归! (按顺序打印位的懒惰方式)

print(int x) {
if(!x) return;
print(x>>1);
printf("%d", x & 1);
}

答案 4 :(得分:1)

最简单的我能想到:

for (int i=15; i>=0; i--) putchar('0'+((x>>i)&1);

答案 5 :(得分:0)

要获得最低位,我会写:

int is_set = (myVar >> 0) & 1;

表达式的第一部分将整数位移向低位。零的偏移什么都不做,但很容易看出那里将如何使用非零值。

表达式的第二部分屏蔽了最低位的所有位。

当这两者组合在一起时,您可以检测是否设置了一个位。

答案 6 :(得分:0)

void print_binary(uint16_t n) {
    char buffer[17];                  /* 16 bits, plus room for a \0 */
    buffer[16] = '\0';                
    for (int i = 15; i >= 0; --i) {   /* convert bits from the end */
        buffer[i] = '0' + (n & 1);    /* '0' + bit => '0' or '1' */
        n >>= 1;                      /* make the next bit the 'low bit' */
    }

    /* At this point, `buffer` is `n` turned to a string of binary digits. */

    printf("%s\n", buffer);
}

答案 7 :(得分:0)

const char *nyb[5] = {
  "0000", "0001", "0010", "0011",
  "0100", "0101", "0110", "0111",
  "1000", "1001", "1010", "1011",
  "1100", "1101", "1110", "1111",
};

#define NYB(NUM, NY) (nyb[((NUM) >> (4*(NY))) & 0xf])

/* ... */

void print_u32(unsigned long u)
{
  printf("%s%s%s%s%s%s%s%s",
         NYB(u, 7), NYB(u, 6), NYB(u, 5), NYB(u, 4),
         NYB(u, 3), NYB(u, 2), NUB(u, 1), NYB(u, 0));
}

:) :) :))