bit-manipulation - 无法理解一段代码。c中的按位运算
问题描述
我有以下代码段,无法破译它的作用。
/* assume 0 <= n <=3 and 0 <= m <=3 */
int n8= n <<3;
int m8 = m <<3;
int n_mask = 0xff << n8;
int m_mask = 0xff << m8; // left bitshifts 255 by the value of m8
int n_byte = ((x & n_mask) >> n8) & 0xff;
int m_byte = ((x & m_mask) >> m8) & 0xff;
int bytes_mask = n_mask | m_mask ;
int leftover = x & ~bytes_mask;
return ( leftover | (n_byte <<m8)| (m_byte << n8) );
解决方案
它交换第 n 个和第 m 个字节。
开始有两个并行计算,一个序列n
和一个序列m
选择第 n 个和第 m 个字节,如下所示:
步骤1:0xff << n8
0x000000ff << 0 = 0x000000ff
.. 8 = 0x0000ff00
.. 16 = 0x00ff0000
.. 24 = 0xff000000
第2步:x & n_mask
x = 0xDDCCBBAA
x & 0x000000ff = 0x000000AA
x & 0x0000ff00 = 0x0000BB00
x & 0x00ff0000 = 0x00CC0000
x & 0xff000000 = 0xDD000000
第 3 步:(((x & n_mask) >> n8) & 0xff
注意:& 0xff
是必需的,因为右移可能是算术右移,如果代码使用无符号整数,则不需要)
n = 0: 0x000000AA
1: 0x000000BB
2: 0x000000CC
3: 0x000000DD
所以它提取第 n 个字节并将其放在整数的底部。
同样的事情也发生在m
.
leftover
是其他(2 或 3)字节,前一个进程未提取的字节。可能还剩下 3 个字节,因为 n 和 m 可以相同。
最后最后一步是将它们重新组合在一起,但是从第 n 个位置提取的字节转移到第 m 个位置,第 m 个字节转移到第 n 个位置,所以它们交换位置。
推荐阅读
- git - 我可以“启动”已发布的 git 提交吗?
- python - ValueError:查看限制最小值 -34780.4 小于 1
- javascript - 在 React Native (iOS) 中使内容适合视图的高度
- python - 使用 Appium 和 Python 进行“包含”的测试自动化
- dataframe - 获取 Julia 数据帧中一行的索引(类似于 iterrows?)
- datetime - 日期格式 - Dataweave
- python - 使用 2 个参数在 df 中创建新列
- swift - 努力弄清楚如何使用 UserDefault 让用户保持登录状态
- python - Django 无法在页面上显示登录错误
- r - 每个列表列中的唯一计数