繁体   English   中英

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

[英]Change 4 middle bits of a byte in C

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

假设我们开始:

In = 0bABCDEFGH
Out = 0bXXXXXXXX // Some random byte

我想要:

Out = 0bXXABCDXX

Out极端中的任何其他位保持不变。

我怎样才能做到这一点?

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

我必须:

(0b00111100 & (IN>>2)) = 0b00ABCD00

,它过滤了高半字节并将其居中,然后呢? 我怎样才能把它移到Out

简单的:

out &= 0b11000011;
out |= (in >> 2 & 0b00111100);

out &= 0b11000011out0bxx0000xx保存2最显著位和2至少显著位。 in >> 2将输入移动 2 给我们0xYYABCDEFYY可能是0011取决于A是什么。 为了摆脱YYEF我们做& 0b00111100

正如@JB 0B所指出的那样,不是标准符号,因此您应该使用其他东西,最好是十六进制0x符号。 有关更多信息,请参阅内容。

因此使用十六进制这将是:

out &= 0xC3;
out |= (in >> 2 & 0x3C)

这是转换表

`0xf` is `0b1111`
`0x3` is `0b0011`
`0xc` is `0b1100`

假设inoutunsigned char ,并且CHAR_BIT == 8

out = (out & 0xC3) | ((in >> 2) & 0x3C);

即总共 4 次操作。

有多种选择。 从高层次的角度来看,你可以

  • 强制Out的四个中间位off ,从In准备一个掩码,如您的问题所示,并通过按位或( | )组合Out和掩码
  • 强制关闭Out的四个中间位,从In准备一个掩码,如您的问题所示,并通过按位 EXCLUSIVE OR ( ^ ) 组合Out和掩码
  • 强制将Out的四个中间位打开,从In准备一个掩码,类似于你现在所做的,但要打开外位,并通过按位 AND ( & ) 组合Out和掩码
  • 使用一系列移位、掩码和加法或按位或运算来逐段构建所需的结果

强制位关闭是通过按位与实现的,掩码在(仅)您要关闭的位置处为 0。

强制位打开是通过按位或与掩码实现的,该掩码(仅)在您要打开的位置处具有 1。

您似乎已经掌握了转移的技巧,但如果您碰巧转移了有符号类型的对象,则确实需要小心。 尽可能使用无符号类型进行位操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM