繁体   English   中英

位操作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位整数的所有可能值均有效时,会出现以下错误消息:

错误:测试allEvenBits(-2147483647 [0x80000001])失败...

...给出1 [0x1]。 应该为0 [0x0]

即使我在每个阶段对所有偶数位进行“与”运算,所以当最终操作的结果为0时,我也无法获得返回1的函数。我尝试使用较小的8位数字进行类似的运算,它给出了正确的答案,所以我不知道此实现发生了什么问题。

您的陈述,例如

y>>16;

缺少=号,因此无效,请尝试

y>>=16;
...
p>>=8;
...
r>>=4;
...
t>>=2;

另外,按照@abligh的建议将其声明为unsigned int

不要右移带符号的整数。 这是C语言中未定义的行为。(可能)您将从左侧进行符号扩展。 尝试使用unsigned int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM