是按位&相当于模运算

时间:2015-03-04 09:12:41

标签: c

我遇到了以下代码片段,在我看来是将整数转换为二进制等价。 谁能告诉我为什么使用& 1而不是%2?非常感谢。

for (i = 0; i <= nBits; ++i) {
    bits[i] = ((unsigned long) x & 1) ? 1 : 0;
    x = x / 2;
}

4 个答案:

答案 0 :(得分:10)

无符号整数的表示由标准指定:带有 n 值位的无符号整数表示[0,2 n 范围内的数字),具有通常的二进制语义。因此,最低有效位是除以2后整数值的余数。

用低级位操作替换可读数学是否有用是值得商榷的。这种风格在70年代很流行,因为编译器并不是很聪明。现在我认为你可以假设编译器会知道除以2可以实现为位移等,所以你可以写出你的意思。

答案 1 :(得分:1)

代码片段的作用,不是将unsigned int转换为二进制数(它的内部表示已经是二进制)。它使用unsigned int的位值创建了一个位数组。如果愿意的话,将它传播到阵列上。

e.g. x=3  =>  bits[2]=0 bits[1]=1 bits[0]=1

要做到这一点

  1. 它选择数字的最后一位并将其放在bits数组中 (&amp; 1操作)。
  2. 然后将数字向右移动一个位置(/ 2是 相当于&gt;&gt; 1)。
  3. 对所有位重复上述操作
  4. 您可以使用%2而不是&amp; 1,生成的代码应该相同。但我想这只是编程风格和偏好的问题。对于大多数程序员来说,&amp; 1比%2更清晰。

答案 2 :(得分:1)

在您的示例中,%2&1是相同的。哪一个可能只是一个品味问题。虽然%2对于具有强大数学背景的人来说可能更容易阅读,但对于具有强大技术背景的人来说,&1更容易理解。

答案 3 :(得分:1)

它们在非常特殊的情况下是等效的。这是一种古老的受Fortran影响的风格。