【发布时间】:2017-10-28 18:57:02
【问题描述】:
请您帮忙重新编写这段代码。我无法理解按位左移实际上是如何工作的。如果有更简单的方法来表示此代码,请告诉我。
此代码用于计算数字的位表示中 1(一)的个数。
int numberofones( int value, int count) {
int numchars = 8 * sizeof(int);
int n;
for(n = 0; n < numchars; n++)
{
if(value & (1 << (numchars - 1 - n))) {
count++;
}
}
return count;
}
【问题讨论】:
-
不,右移是符号扩展。移位超过位数是未定义的。
-
@yano -- 将负值向左移位会导致未定义的行为;将非负值向左移位(只要结果可表示)是明确定义的。
-
啊,哎呀,这是
1转移了,我在想numchars.. 看起来不够仔细 -
@yano -- 不过,在使用移位运算符时,使用
unsigned类型是一个好习惯.... -
@wildplasser 从技术上讲:“E1 >> E2 的结果是 E1 右移 E2 位位置 [...] 如果 E1 具有带符号类型和负值,则结果值是实现定义的。” 根据第 6.5.7 节。
标签: c gcc computer-science