基于两个数字的按位运算

时间:2013-04-12 05:23:32

标签: bit-manipulation mask bits bitmask

我今天在我的教员(塞尔维亚贝尔格莱德数学系)获得了一项任务,其中说:

1)编写一个程序,对于两个给定的整数x和y,在整数x中反转与y中相应位匹配的那些位,而其余位保持不变。

例如:

x  = 1001110110101
y  = 1100010100011
x' = 0011101011100

我设法写了一个程序来做到这一点,但我对我的解决方案的质量有点不安全。如果你有时间,请查看代码并告诉我如何改进它。

int x, y, bitnum;
int z = 0;
unsigned int mask;

bitnum = sizeof(int) * 8;
mask = 1 << bitnum - 1;

printf("Unesi x i y: ");
scanf("%d%d", &x, &y);

while (mask > 1) {
    if ( (((x & mask) == 0) && ((y & mask) == 0)) ||
          ((x & mask) && ((y & mask) == 0)) )
        z += 1;                                   
    z <<= 1;
    mask >>= 1;
} /* <-- THAT'S HOW STUPID PEOPLE SOLVE PROBLEMS... WITH HAMMER! */
z = y~; /* <-- THAT'S HOW SMART PEOPLE SOLVE PROBLEMS... WITH ONE LINE */

一切正常,例如,对于x = 423和y = 324,我得到z = -344,这是正确的。此外,位打印匹配我想知道是否有更好的方法来做到这一点。

感谢。

2 个答案:

答案 0 :(得分:0)

如果您查看x / y / x'示例,则必须告诉您x'y的补充。确实就是这样。

 x  y  x'
 --------
 1  1  0
 0  0  1
 1  0  1
 0  1  0

Spoiler(如果你想看到一个解决方案,将鼠标悬停在下面的块上):

  

对于匹配的位,您将x中的位反转,但由于它与y中的位相同,所以它与y中的反转位相同。如果它们不匹配,则保持位x,即y中已经反转的位。我希望你能亲自看到一线解决方案:x' = ~y;  

答案 1 :(得分:0)

//尝试使用下一个代码:

unsigned int mask1,mask2,mask3,answers;

mask1 = x&amp; Ÿ; //识别1匹配

的位

mask2 = ~x&amp; 〜ÿ; //识别0匹配

的位

mask3 = mask1 |掩码2; //识别0或1匹配

的位

answers = x ^ m3; //更改已识别的位