【问题标题】:Bitwise operations based on two numbers基于两个数的位运算
【发布时间】:2013-04-12 05:23:32
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: bit-manipulation mask bits bitmask


    【解决方案1】:

    如果您查看x/y/x' 示例,您一定会发现x'y 的补充。确实是这样。

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

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

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

    【讨论】:

    • 这正是我所说的更聪明的意思...想想我花了半个小时来弄清楚如何使用位掩码和推动位... facepalm跨度>
    【解决方案2】:

    //用下一个代码试试:

    unsigned int mask1, mask2, mask3, answ;

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      相关资源
      最近更新 更多