【发布时间】:2015-01-27 06:08:54
【问题描述】:
我只能使用下面提到的按位运算符来创建描述的函数:
/*
* 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
*/
我们使用 2s 补码,整数的 32 位表示。此外,我只能使用整数常量 0 到 255 (0xFF),包括在内。我的蛮力解决方案如下:
int allEvenBits(int x) {
int mask0 = 0x55;
int mask1 = 0x55 << 8;
int mask2 = 0x55 << 16;
int mask3 = 0x55 << 24;
return(!(x ^ (mask0 | mask1 | mask2 | mask3)));
}
所以我基本上创建了一个 0x55555555 掩码,将掩码与 x 进行异或运算,并否定此操作,假设 (x ^ 0x55555555) 等于 0 的唯一时间是 x 等于 0x55555555。 (基于x ^ x == 0的异或属性。)
因此,当x == 0x55555555 时,这应该是我的函数唯一一次返回 1。当x == 0x55555555 时它确实返回 1。
但是,我的功能不正确,我无法弄清楚原因。是我的逻辑有缺陷还是我的代码有问题?
【问题讨论】:
-
如果设置了所有偶数位加上其他一些位,您确定该函数不应该返回 1 吗?例如 0xFFFFFFFF 似乎应该返回 1。
-
如果单个 int 可以保存您的值
0x55555555并像int mask = 0x55555555; return (!(x ^ mask));那样做,为什么要提出多个 int -
不允许使用大于 0xFF 的 int 字面量吗?
-
你的逻辑是错误的,因为它忽略了任何奇数位的存在
-
为什么说“函数不正确”?尤其是在说它确实有效之后。
标签: c bit-manipulation bitwise-operators