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 状态?(基本上打印二进制字符串表示)。

4

4 回答 4

13

最好的将是

  (n >> i) & 0x1

它比任何其他通过“布尔”转换的方法更可靠地无分支。

在可能且合理的情况下,最好向右移动,以便您感兴趣的位最终位于正确的位置以形成您需要的结果,从而消除任何额外步骤的需要。

于 2012-12-22T23:42:08.983 回答
3

怎么样!!(n & (1 << i))?或者(n & (1 << i)) != 0

我觉得这两个都是比你提出的建议更好的选择(不,我没有自己想出 !! ,我在一些代码中阅读它,并从那里拿起它 - 它经常被使用例如在 Xen 和 Linux 中)

为了使其更具可读性,可以考虑:

inline zero_or_one_bit(int n, int i)
{
    return !!(n & (1 << i));
}
于 2012-12-22T23:38:27.787 回答
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);
于 2012-12-22T23:39:24.510 回答
0

我喜欢 AndreyT 的回答,但为了完整起见:您可以轻松地从该三元组中获得更多工作(您可能会惊讶 %d 的成本有多大):

putc( (n & ( 1 << i ))!=0 ? '1' : '0', stdout ); 

是的,如果愿意的话

putc(   ((n>>i) & 1) + '0',  stdout );
于 2012-12-24T17:02:11.433 回答