gpt4 book ai didi

c - C 中的按位运算 : Can't figure out why XOR does not work. 我的代码或逻辑是否有缺陷?

转载 作者:太空狗 更新时间:2023-10-29 15:35:32 26 4
gpt4 key购买 nike

我只能使用下面提到的位运算符来创建描述的函数:

/* 
* 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 的 XOR 属性。)

因此,当 x == 0x55555555 时,这应该是我的函数唯一一次返回 1。当 x == 0x55555555 时它确实返回 1。

但是,我的功能不正确,我也不知道为什么。是我的逻辑有缺陷还是我的代码?

最佳答案

您正在切换偶数位,然后将结果与 0 进行比较。但是,即使所有偶数位都为 1,奇数位仍保持不变,因此每当奇数位为 1 时,您的函数将返回 0。它只有当所有奇数位都为 0 时才能正常工作

return (!(x ^ (mask0 | mask1 | mask2 | mask3)));

你也需要清除所有的奇数位

int allEvenBits(int x) {
int mask = 0x55;
int mask = mask | (mask << 8);
int mask = mask | (mask << 16);

return !(x & mask);
}

另一种方式

int allEvenBits(int x) {
int mask = 0xAA;
int mask = mask | (mask << 8);
int mask = mask | (mask << 16);

return !((x | mask) ^ (~0));
}

另一种更短的方式

x &= x >> 16;
x &= x >> 8;
return !((x & 0x55) ^ 0x55);
// or return !(((x | 0xAA) + 1) & 0xFF);

关于c - C 中的按位运算 : Can't figure out why XOR does not work. 我的代码或逻辑是否有缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com