【问题标题】:Change 4 middle bits of a byte in C在C中更改一个字节的4个中间位
【发布时间】:2018-11-29 18:34:06
【问题描述】:

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

假设我们开始:

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

我想要:

Out = 0bXXABCDXX

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

我该怎么做?

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

我必须:

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

,它过滤高半字节并将其居中,但那又如何呢?如何将其移至Out

【问题讨论】:

    标签: c bit-manipulation


    【解决方案1】:

    简单:

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

    out &= 0b11000011out 设置为 0bxx0000xx 保留 2 个最高有效位和 2 个最低有效位。 in >> 2 将输入移动 2 给我们 0xYYABCDEFYY 可能是 0011,具体取决于 A 是什么。为了摆脱YYEF,我们使用& 0b00111100

    正如@JB 所指出的,0B 不是标准符号,因此您应该使用其他符号,最好是十六进制 0x 符号。请参阅this 了解更多信息。

    因此使用十六进制将是:

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

    这是换算表

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

    【讨论】:

    • 可以减少到 4 个操作而不是 5 个。
    • 这个out &= 0b00111100 应该是out |= 0b00111100 不是吗?
    【解决方案2】:

    假设inoutunsigned char,那么CHAR_BIT == 8

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

    即总共 4 次操作。

    【讨论】:

      【解决方案3】:

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

      • 强制Out 的四个中间位关闭,从In 准备一个掩码,如您的问题所示,并通过按位或组合Out 和掩码(|
      • 强制Out 的四个中间位关闭,从In 准备一个掩码,如您的问题所示,并通过按位异或(^)组合Out 和掩码
      • 强制Out 的四个中间位打开,与您现在的操作类似,从In 准备一个掩码,但打开外部位,然后将Out 和掩码通过按位与 (&)
      • 使用一系列移位、掩码和加法或按位或运算逐节构建所需的结果

      强制位关闭是通过按位与使用掩码实现的,该掩码(仅)在您要关闭的位置具有 0。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-31
        • 2023-02-24
        • 2011-07-17
        • 2021-07-23
        • 2014-05-13
        • 2022-05-04
        • 2019-09-19
        • 2015-04-14
        相关资源
        最近更新 更多