c - 在C中更改一个字节的4个中间位
问题描述
我正在尝试将一个字节的 4 个中间位更改为对应于另一个字节的高半字节:
假设我们开始:
In = 0bABCDEFGH
Out = 0bXXXXXXXX // Some random byte
我想:
Out = 0bXXABCDXX
保持任何其他位在Out
's 的极端不变。
我怎样才能做到这一点?
注意: “X”代表任何位,0 或 1,只是为了区分来自输入的内容。
我必须:
(0b00111100 & (IN>>2)) = 0b00ABCD00
,它过滤了高半字节并将其居中,但是然后呢?我怎样才能把它移到Out
?
解决方案
简单的:
out &= 0b11000011;
out |= (in >> 2 & 0b00111100);
out &= 0b11000011
设置out
为0bxx0000xx
保留 2 个最高有效位和 2 个最低有效位。in >> 2
将输入移动 2 给我们0xYYABCDEF
,YY
可能是00
或11
取决于是什么A
。摆脱,YY
我们EF
做& 0b00111100
。
正如@JB 所指出的,这0B
不是标准符号,因此您应该使用其他东西,最好是十六进制0x
符号。有关更多信息,请参阅此内容。
因此使用十六进制这将是:
out &= 0xC3;
out |= (in >> 2 & 0x3C)
这是转换表
`0xf` is `0b1111`
`0x3` is `0b0011`
`0xc` is `0b1100`
推荐阅读
- amazon-quicksight - 如何在 Amazon QuickSight 中进行周期比较?
- python - 巨大的 HTML 表格 - 过滤包含字符串的行
- ibm-watson - Watson Discovery:通过 API 处理数据的问题
- python - 在间隔日期中添加行
- swift - 为什么传递给函数的协议默认值不会改变,即使函数在子类化时会改变?
- python-3.x - 如何从 spinbox 获取 Int 值以创建新条目
- c++ - 如何添加到 Visual Studio 2017 或 2019 旧 C++ (v110) 编译器?
- python-3.x - 如何使用 VS python Jupiter 单元打开 csv 文件
- firebase - Flutter build 给出 .pub-cache cloud firestore 错误
- c++ - 如何在 C++17 中为通用嵌套容器编写函数?