位操作 C allEvenBits
bit manipulation C allEvenBits
我必须使用位运算来完成某些事情。
这就是问题问我的问题:
/*
* allEvenBits - return 1 if all even-numbered bits in word set to 1
* Examples allEvenBits(0xFFFFFFFE) = 0, allEvenBits(0x55555555) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 12
* Rating: 2
*/
这是我的计算结果:
int allEvenBits(int x) {
int y, z, p, q, r, s, t, u, k;
y=x;
z=y&0x5555;
y>>16;
p=y&z;
q=p&0x055;
p>>8;
r=q&p;
s=r&0x05;
r>>4;
t=s&r;
u=t&0x01;
t>>2;
k=u&t;
return k;
}
但每次我 运行 测试该函数是否适用于 32 位整数的所有可能值时,我都会收到此错误消息:
ERROR: Test allEvenBits(-2147483647[0x80000001]) failed...
...Gives 1[0x1]. Should be 0[0x0]
这个,即使我在每个阶段都对所有偶数位进行 ANDing,所以当最终操作产生 0 时,我无法将函数设为 return 1。我尝试了数学运算类似形式的较小的 8 位数字,它给出了正确的答案,所以我不明白这个实现有什么问题。
不要将有符号整数右移。这是 C 语言中未定义的行为。您将(可能)从左侧进行符号扩展。尝试 unsigned int
.
你的陈述如
y>>16;
缺少=
符号,所以没有效果,试试
y>>=16;
...
p>>=8;
...
r>>=4;
...
t>>=2;
此外,按照@abligh 的建议声明为unsigned int
。
我必须使用位运算来完成某些事情。 这就是问题问我的问题:
/*
* allEvenBits - return 1 if all even-numbered bits in word set to 1
* Examples allEvenBits(0xFFFFFFFE) = 0, allEvenBits(0x55555555) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 12
* Rating: 2
*/
这是我的计算结果:
int allEvenBits(int x) {
int y, z, p, q, r, s, t, u, k;
y=x;
z=y&0x5555;
y>>16;
p=y&z;
q=p&0x055;
p>>8;
r=q&p;
s=r&0x05;
r>>4;
t=s&r;
u=t&0x01;
t>>2;
k=u&t;
return k;
}
但每次我 运行 测试该函数是否适用于 32 位整数的所有可能值时,我都会收到此错误消息:
ERROR: Test allEvenBits(-2147483647[0x80000001]) failed...
...Gives 1[0x1]. Should be 0[0x0]
这个,即使我在每个阶段都对所有偶数位进行 ANDing,所以当最终操作产生 0 时,我无法将函数设为 return 1。我尝试了数学运算类似形式的较小的 8 位数字,它给出了正确的答案,所以我不明白这个实现有什么问题。
不要将有符号整数右移。这是 C 语言中未定义的行为。您将(可能)从左侧进行符号扩展。尝试 unsigned int
.
你的陈述如
y>>16;
缺少=
符号,所以没有效果,试试
y>>=16;
...
p>>=8;
...
r>>=4;
...
t>>=2;
此外,按照@abligh 的建议声明为unsigned int
。