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状态的更好选择? (基本上打印二进制字符串表示。)
答案 0 :(得分:13)
最好的是
(n >> i) & 0x1
它比任何其他通过“布尔”转换的方法更可靠地无分支。
在可能和合理的情况下,更喜欢向右移动,以便您感兴趣的位最终位于正确的位置以形成您需要的结果,从而无需任何额外的步骤。
答案 1 :(得分:3)
!!(n & (1 << i))
怎么样?
还是(n & (1 << i)) != 0
?
我认为这些都是比你制作的推荐更好的选择(不,我没有拿出!!我自己,我用一些代码读了它,并从那里拿起它 - 它是经常在Xen和Linux中使用,例如)
为了使其更具可读性,可以考虑:
inline zero_or_one_bit(int n, int i)
{
return !!(n & (1 << i));
}
答案 2 :(得分:3)
而不是左移,右移:
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);
答案 3 :(得分:0)
我喜欢AndreyT的回答,但为了完整性:你可以轻松地从这个三元组中获得更多的工作(你可能会惊讶于%d的成本是多少):
putc( (n & ( 1 << i ))!=0 ? '1' : '0', stdout );
是的,如果愿意的话
putc( ((n>>i) & 1) + '0', stdout );