在C中更改一个字节的4个中间位

A. *_*ira 4 c bit-manipulation

我正在尝试更改一个字节的4个中间位以对应另一个字节的高半字节:

假设我们从:

In = 0bABCDEFGH
Out = 0bXXXXXXXX // Some random byte
Run Code Online (Sandbox Code Playgroud)

我想要:

Out = 0bXXABCDXX
Run Code Online (Sandbox Code Playgroud)

留下任何其他位置Out的极端不变.

我怎样才能做到这一点?

注意: 'X'表示任何位,0或1,只是为了区分来自输入的内容.

我得:

(0b00111100 & (IN>>2)) = 0b00ABCD00
Run Code Online (Sandbox Code Playgroud)

,过滤高半字节并使其居中但是接着是什么?我怎么能把它移动到Out

0x4*_*16e 6

简单:

out &= 0b11000011;
out |= (in >> 2 & 0b00111100);
Run Code Online (Sandbox Code Playgroud)

out &= 0b00111100设置out0bxx0000xx保留2个最高有效位和2个最低有效位.in >> 2转移输入2给我们0xYYABCDEF,YY可能是0011取决于什么A.为了摆脱YYEF我们做的& 0b00111100.

正如@JB指出的那样0B不是标准符号,因此你应该使用别的东西,最好是十六进制0x表示法.有关详细信息,请参阅

因此使用hex这将是:

out &= 0xC3;
out |= (in >> 2 & 0x3C)
Run Code Online (Sandbox Code Playgroud)

这是转换表

`0xf` is `0b1111`
`0x3` is `0b0011`
`0xc` is `0b1100`
Run Code Online (Sandbox Code Playgroud)


Aco*_*orn 5

假设in并且outunsigned char,并且CHAR_BIT == 8:

out = (out & 0xC3) | ((in >> 2) & 0x3C);
Run Code Online (Sandbox Code Playgroud)

即总共4次操作.