首页 > 解决方案 > 我不明白如何移位 16 位、8 位等。'&' 的组合检测偶数位中的 1

问题描述

我正在编写一个程序来检测偶数位中是否有一个。例如,0101 在偶数位置有一个。这个解决方案恰好有效,但我不知道为什么。

让我感到困惑的是,当我们向右移动 16 位时。例如 0101 我们只是在创建 0000 0000 0000 0000 0101 对吗?然后我们用原始数字做一个 and 所以它是 0000 0000 0000 0000 0101 & 0000 0000 0000 0000 0101 是同一个数字吧?因此,如果我们一遍又一遍地进行这种转换并最终 x&1,我看不出这如何帮助任何东西在 allEvenbits 时返回 1。

/* 
 * 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
 */

int allEvenBits(int x) {
  //0xAA - OxFF are valid entries
  x = x & (x >> 16);
  x = x & (x >> 8);
  x = x & (x >> 4);
  x = x & (x >> 2);
  return x&1; 
}

标签: carchitecturebinarybyte

解决方案


请记住,整数(至少对于本练习而言)是 32 位长的。因此,如果您在以下位置进行 16 位右移:

0000 0000 0000 0000 0000 0000 0000 0101
------------------- -------------------
  These  \          Right bits discarded
  bits are  \
  shifted 16   \
  positions right \ 
                     \
                        \
                           \
                    -------------------
0000 0000 0000 0000 0000 0000 0000 0000
Zeros enter on left

其余的班次继续这个过程;总而言之,总移位为 30 位,因此只有最后两位可以具有非 0 的值。只有当偶数位的所有位都为 1 时,最后一位才会为 1;如果奇数位置的所有位都为 1,则倒数第二位为 1 pnly。

在这种情况下,合取为 0,表示既没有设置每个偶数位也没有设置每个奇数位。没错;只设置了两个偶数位。


推荐阅读