1

我今天在我的学院(塞尔维亚贝尔格莱德数学学院)接到了一个作业,上面写着:

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

例如:

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,这是正确的。此外,位打印匹配我只是想知道是否有更好的方法来做到这一点。

谢谢。

4

2 回答 2

0

如果您看一下您的x//示例yx'您一定会觉得这x'是对y. 确实是这样。

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

剧透(如果您想查看解决方案,请将鼠标悬停在下面的块上):

对于匹配的位,您反转 bit in x,但由于它与 bit in 相同y,因此与反转 bit in 相同y。当它们不匹配时,您会保留该位x,它本身已经是位的反转y。我希望您自己已经可以看到单行解决方案:x' = ~y;

于 2013-04-12T05:46:48.847 回答
0

//尝试下一个代码:

无符号整数掩码1,掩码2,掩码3,答案;

掩码1 = x & y; // 用 1 识别匹配的位

掩码2 = ~x & ~y; // 识别匹配的 0 位

掩码 3 = 掩码 1 | 掩码2;// 识别匹配的 0 或 1 位

答案 = x ^ m3; // 改变识别位

于 2013-04-12T06:10:54.477 回答