C中的按位运算:无法弄清为什么XOR不起作用。我的代码或逻辑有缺陷吗?

问题描述 投票:4回答:3

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

/* 
*  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进行XOR,并假设只有(x ^ 0x55555555)等于0的时间是x等于0x55555555时才取消此操作。 (基于x ^ x == 0的XOR属性。)

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

但是,我的功能不正确,我无法弄清楚原因。我的逻辑有缺陷还是我的代码?

我只能使用下面提到的按位运算符来创建所描述的函数:/ * * allEvenBits-如果单词中所有偶数位都设置为1,则返回1 *示例allEvenBits(0xFFFFFFFE)= 0,...

c bit-manipulation bitwise-operators
3个回答
1
投票

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

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

您也需要清除所有奇数位


2
投票

按照问题陈述而不是您的处方,该函数对于0x55555555仅应返回1,这是一种方法:

int allEvenBits(int x) {
  int filled = x | 0xAAAAAAAA;
  return !(filled + 1);
}

0
投票
// Get a platform-independent mask of all even bits in an int set to one:
#define MASK ( (unsigned int) 0x55555555u )

/* MASK will be 0x5555u or 0x55555555u depending on sizeof(int).
   And then the actual algorithm: */
unsigned int allEvenBits(int x) 
{
  return (unsigned int)( !(x ^ MASK) );
}
© www.soinside.com 2019 - 2024. All rights reserved.