int n = 1; //Arbitrary value
for ( int i = 0;i < 8;i++ )
{
printf( "%d",n & ( 1 << i ) ? 1 : 0 ); //Ternary
printf( "%d",0 || n & ( 1 << i ) ); //Logical OR
}
在循环中的两个表达式中,哪一个更适合用于打印二进制值的 0 或 1 状态?(基本上打印二进制字符串表示)。
int n = 1; //Arbitrary value
for ( int i = 0;i < 8;i++ )
{
printf( "%d",n & ( 1 << i ) ? 1 : 0 ); //Ternary
printf( "%d",0 || n & ( 1 << i ) ); //Logical OR
}
在循环中的两个表达式中,哪一个更适合用于打印二进制值的 0 或 1 状态?(基本上打印二进制字符串表示)。
最好的将是
(n >> i) & 0x1
它比任何其他通过“布尔”转换的方法更可靠地无分支。
在可能且合理的情况下,最好向右移动,以便您感兴趣的位最终位于正确的位置以形成您需要的结果,从而消除任何额外步骤的需要。
怎么样!!(n & (1 << i))
?或者(n & (1 << i)) != 0
?
我觉得这两个都是比你提出的建议更好的选择(不,我没有自己想出 !! ,我在一些代码中阅读它,并从那里拿起它 - 它经常被使用例如在 Xen 和 Linux 中)
为了使其更具可读性,可以考虑:
inline zero_or_one_bit(int n, int i)
{
return !!(n & (1 << i));
}
与其向左移动,不如向右移动:
for (int i = 7; i >= 0; --i)
printf("%d", (n >> i) & 1);
但是,从某种意义上说,如果是微编码指令,它们可能都效率低下1 << i
(根据下面的评论,这显然不太可能)。
这是一个仅进行恒定班次的版本:
for (int i = 0, n2 = n; i < 8; i++, n2 <<= 1)
printf("%d", (n2 >> 7) & 1);
我喜欢 AndreyT 的回答,但为了完整起见:您可以轻松地从该三元组中获得更多工作(您可能会惊讶 %d 的成本有多大):
putc( (n & ( 1 << i ))!=0 ? '1' : '0', stdout );
是的,如果愿意的话
putc( ((n>>i) & 1) + '0', stdout );