c - 我不明白如何移位 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;
}
解决方案
请记住,整数(至少对于本练习而言)是 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,表示既没有设置每个偶数位也没有设置每个奇数位。没错;只设置了两个偶数位。
推荐阅读
- vue.js - 可拖动组件不适用于 Vue.Js 中的 div
- linux - 3x1t ssd zfs 镜像,其中两个有故障,另外一个也有错误。如何排除故障?
- r - 如何选择向量中的元素块
- javascript - 在 API 所需的 Header 值是否使用 MODHeader 扩展覆盖?如何禁用更高的环境?
- firebase - 使用firebase在flutter中构建聊天屏幕时出错
- c++ - 多线程原子 ab 为 memory_order_relaxed 打印 00
- c++ - Macbook更新后Clion编译器无法正常工作?
- php - 如何使用 WP_Query 统计帖子?
- python - 我将如何使用他们的名字和平均收视率准备前 15 部电影的表格?
- python - 如何将不同的单位转换为单个单位?