如何打印一个比特?

7
请告诉我如何打印一个位(bit),例如printf("%d",bit);

这是一个需要重新表述的好问题,但我还没有编辑权限... - Jarred McCaffrey
6个回答

20

如果bit只是一个包含你想要的最低位值的整数,那么:

printf("%d", bit & 0x1);

应该这样做。& 运算符是将一个只有第一位为1的数字与另一个数字进行按位与运算,因此你在整数中删除了所有其他位。


请记住,从多字节数字中提取一个位会导致字节序问题。 - gnud
4
只有在使用指针访问内存时才适用。无论值在内存中的存储方式如何,bit & 0x1 都会起作用。请注意不要改变原意。 - unwind

10

如果您需要比 Herms 更加泛化,可以这样做:

#define IsBitSet(val, bit) ((val) & (1 << (bit)))

/* ... your code ... */

printf ("%c", IsBitSet(bit, 0) ? '1' : '0');

printf相当于Herms的答案。

如果您在谈论C语言中的位域,则可以这样做:

struct foo { int b:1; } myFoo;

printf("%c", myFoo.b ? '1' : '0');

宏定义末尾缺少闭合括号,是吗? - bortzmeyer
2
这似乎有点绕 - 为什么不使用 ((val) >> (bit)) & 0x1,这样你就可以将其作为整数打印,而不是三元运算符? - Aaron Dufour

6

3

要打印 n 的第 m 位(m 为 1..16 或 32):

void print_bit(n, m)
{
    printf("%d", n & (1 << (m - 1)));
}

如果您的比特计数器从0开始,请移除- 1位。


那不太行。你遮盖了你想要的位,但是你却把那一位留在原地,所以你得不到1或0。为了始终获得该位的1或0,你需要将变量向右移位,而不是将掩码向左移位。 - Herms
1
你的函数中的“bit”是什么?而且“n”没有被使用。你的意思是 printf("%d", n & (1 << (m - 1)) 吗? - Koshmaar

1
你可以使用 "union":
union bitshow {
    unsigned bit1:1;
    int i;
};

int main() {
    union bitshow bit;
    cin >> bit.i;
    cout << bit.bit1;
    return 0;
}

3
能否打印出最高有效位、最低有效位或其他内容?你无法确定,因为它不具备可移植性。 - interjay

1

使用本地的bool类型,C++的答案比C89更容易:

bool b = true;
std::cout << b;

C99非常相似:

_Bool b = 1;
printf("%d", b);

布尔值通常不是一位大小。 - Jasper Bekkers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接