c - 无法理解如何设置位
问题描述
对于我的系统课上的作业,我们正在学习位操作的工作原理,但我在将其实现到这个函数中时遇到了麻烦:
void setting_bits(int value, int pos, int n) {
int n_val = value;
printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);
int mask = 1;
mask = (mask << n)-pos-1;
n_val = n_val & ~mask;
printf("0x%X",n_val);
printf("\n");
}
这是一个示例输入输出:
setting_bits(0xA1B2C3D4, 1, 4) -> 0xA1B2C3DE
我只是不明白如何去逻辑。我想我了解如何修改位以及掩码如何工作等基础知识,但我不确定如何将它们放在一起。我的课堂论坛没有用,我的教授也没有回复电子邮件,所以我是最后的手段。任何回应将不胜感激。我不想在余下的职业生涯中讨厌十六进制。
解决方案
这是函数的重写:
void setting_bits(unsigned value, int pos, int n) {
printf("\nsetting_bits(0x%X, %i, %i) -> ",value,pos,n);
unsigned n_val = value | ((1u << n) - 1) << pos;
printf("0x%X\n", n_val);
}
...设置从位位置开始的n
连续位并显示结果。pos
value
这里的关键部分是value | ((1u << n) - 1) << pos
.
(1u << n)
让我们设置一个位,后跟n
零位。然后我们从中减去 1,这给了我们n
设置位。然后我们将所有的左边pos
移到正确的位置。最后,我们将它与为我们提供价值的旧值进行按位或,但如果它们尚未设置,则将所有这些位设置为。
使用 8 位二进制的示例,value
分别为 0101 0101、3n
和pos
2:
(1u << n) --> 00000001b << 3 --> 00001000b
((1u << n) - 1) --> 00001000b - 1 --> 00000111b
((1u << n) - 1) << pos --> 00000111b << 2 --> 00011100b
value | ((1u << n) - 1) << pos --> 01010101b | 00011100b --> 01011101b
推荐阅读
- jquery - 表单错误时如何防止 jQuery .submit 触发
- javascript - 什么时候 JavaScript 代码被认为是 GC 垃圾
- r - 如何从 R 中的 tab_model 中提取变量以创建新的数据框?
- machine-learning - 如何对数字标记形式的文本数据应用分类算法?
- c++ - 捕获后如何从 std::exception 取回原始异常?
- c++ - 如何区分 RPC 有效载荷数据长度?
- python - 我应该只使用“完全相同”的输入形状进行迁移学习吗?
- javascript - 如何更新视频源以播放新视频
- javascript - React Native:从本地主机服务 URI 不呈现图像
- android - 如何防止点击事件触发两次