可能重复:
C printing bits
假设我有一个类似于uint16_t的数字:
uint16_t myVar = 0x3A44;
我想从myVar打印二进制值,如果是0x3A44,我怎么能迭代访问并打印每一位?
将它视为一个位阵列?
答案 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));
}
:) :) :))