C 哪一位黑客更好,为什么? int n=1//任意值 对于(int i=0;i

C 哪一位黑客更好,为什么? int n=1//任意值 对于(int i=0;i,c,binary,bit-manipulation,C,Binary,Bit Manipulation,如何)!!(n&(1如何)!!(n&(1而不是向左移动,向右移动: inline zero_or_one_bit(int n, int i) { return !!(n & (1 << i)); } 但是,从某种意义上讲,如果1不向左移动,而是向右移动,则它们可能都是低效的: inline zero_or_one_bit(int n, int i) { return !!(n & (1 << i)); } 然而,在某种意义上,如果1最好

如何
)!!(n&(1如何
)!!(n&(1而不是向左移动,向右移动:

inline zero_or_one_bit(int n, int i)
{
    return !!(n & (1 << i));
}

但是,从某种意义上讲,如果
1不向左移动,而是向右移动,则它们可能都是低效的:

inline zero_or_one_bit(int n, int i)
{
    return !!(n & (1 << i));
}
然而,在某种意义上,如果
1最好的是

for (int i = 0, n2 = n; i < 8; i++, n2 <<= 1)
    printf("%d", (n2 >> 7) & 1);
它比任何其他经过“布尔”转换的方法更可靠地没有分支

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

最好是

for (int i = 0, n2 = n; i < 8; i++, n2 <<= 1)
    printf("%d", (n2 >> 7) & 1);
它比任何其他经过“布尔”转换的方法更可靠地没有分支


在可能和合理的情况下,倾向于向右移动,这样您感兴趣的位最终会位于正确的位置,以形成您所需的结果,从而无需任何额外步骤。

我喜欢AndreyT的答案,但为了完整性:您可以很容易地从该三元组中获得更多的工作(您可能会惊讶%d的成本有多高):


我喜欢AndreyT的回答,但出于完整性考虑:您可以很容易地从该三元结构中获得更多的工作(您可能会惊讶%d的成本有多高):


哈哈……它们都是不可读的。我不理解三元表达式或逻辑or的必要性。没有这两个表达式,可以产生相同的输出。它们都很难阅读,因此从这个角度来看,它们同样糟糕。而且可能没有明显的效率差异,因为打印(可能)需要的时间最多,甚至是缓冲。第二个可能更快,因为它没有潜在的跳跃。但是,无论如何,三元运算符的跳跃可能会被comiler优化。所以共识是:不可读。好吧,好吧,我投降!哈哈……它们都一样不可读。我不理解这两个te的必要性rnary表达式或逻辑or。如果没有这两个表达式中的任何一个,可以产生相同的输出。它们都很难阅读,因此从这个角度来看,它们同样糟糕。而且可能没有明显的效率差异,因为打印(可能)需要的时间最多,甚至是缓冲。第二个可能更快,因为它没有潜在的跳跃。但是,无论如何,三元运算符的跳跃可能会被comiler优化。因此,共识是:不可读。好吧,好吧,我投降!移位指令不是AMD处理器上的微代码,我几乎可以肯定它们也不在现代英特尔处理器上,但这有点难找到。我喜欢你的答案。移位指令在AMD处理器上没有微代码,我几乎可以肯定它们也不在现代英特尔处理器上,但这有点难找到。我喜欢你的答案。很好,我从未想过这样做。Ri很好。很好的解决方案。谢谢!关于效率:根据我更古老的经验,测试n&(1i)&当“i”是编译时常量时为1,当i是变量时为更糟。如果目标是得到0或1而不是条件测试,那么这可能不适用。然而,现在大多数编译器都会在内部将这种常见操作从一种形式转换为另一种形式,因此我不再在效率上做出这种选择。我喜欢这种方式我们最好从可读性出发,因为它没有杂乱无章的概念性“布尔”中间词,我认为这些中间词没有帮助。很好,我从来没有想过这样做。没错。很好的解决方案。谢谢!关于效率:根据我更古老的经验,测试n&(1i)&当“i”是编译时常量时为1,当i是变量时为更糟。如果目标是得到0或1而不是条件测试,那么这可能不适用。然而,现在大多数编译器都会在内部将这种常见操作从一种形式转换为另一种形式,因此我不再在效率上做出这种选择。我喜欢这种方式我们最好从可读性来考虑,因为它没有杂乱无章的概念性“布尔”中间词,而在我看来,这些中间词是没有帮助的。
  (n >> i) & 0x1
putc( (n & ( 1 << i ))!=0 ? '1' : '0', stdout ); 
putc(   ((n>>i) & 1) + '0',  stdout );