我遇到了以下代码片段,在我看来是将整数转换为二进制等价。 谁能告诉我为什么使用& 1而不是%2?非常感谢。
for (i = 0; i <= nBits; ++i) {
bits[i] = ((unsigned long) x & 1) ? 1 : 0;
x = x / 2;
}
答案 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
要做到这一点
bits
数组中
(&amp; 1操作)。您可以使用%2而不是&amp; 1,生成的代码应该相同。但我想这只是编程风格和偏好的问题。对于大多数程序员来说,&amp; 1比%2更清晰。
答案 2 :(得分:1)
在您的示例中,%2
和&1
是相同的。哪一个可能只是一个品味问题。虽然%2
对于具有强大数学背景的人来说可能更容易阅读,但对于具有强大技术背景的人来说,&1
更容易理解。
答案 3 :(得分:1)
它们在非常特殊的情况下是等效的。这是一种古老的受Fortran影响的风格。