代码之家  ›  专栏  ›  技术社区  ›  A. Vieira

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

  •  4
  • A. Vieira  · 技术社区  · 8 年前

    我试图改变一个字节的4个中间位来对应另一个字节的高半字节:

    假设我们首先:

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

    我想要:

    Out = 0bXXABCDXX
    

    留下其他的东西 Out 的极端不变。

    我该怎么做?

    注: “x”表示任何位,0或1,只是为了区分输入的内容。

    我必须这样做:

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

    ,它过滤高分位数并使其居中,但接下来呢?我怎么能把它移到 ?

    3 回复  |  直到 8 年前
        1
  •  6
  •   KPCT    8 年前

    简单的:

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

    out &= 0b00111100 集合 out 0bxx0000xx 保留2个最高有效位和2个最低有效位。 in >> 2 将输入值移动2 0xYYABCDEF , YY 可以是 00 11 取决于什么 A 是。摆脱 YY EF 我们做 & 0b00111100 .

    由@jb指出 0B 不是标准符号,因此你应该使用别的东西,最好是十六进制。 0x 表示法。见 this 更多信息。

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

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

    这是转换表

    `0xf` is `0b1111`
    `0x3` is `0b0011`
    `0xc` is `0b1100`
    
        2
  •  5
  •   Acorn    8 年前

    假设 in out unsigned char CHAR_BIT == 8 :

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

    即总共4次操作。

        3
  •  2
  •   John Bollinger    8 年前

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

    • 强制四个中间位 Out 远离的 ,准备一个面具 In 如你问题中所示,并结合 通过按位或掩码( | )
    • 强制四个中间位 远离的 ,准备一个面具 如你问题中所示,并结合 通过按位异或屏蔽( ^ )
    • 强制四个中间位 ,准备一个面具 类似于你现在的做法,但是在打开外部位的情况下,合并 通过位和掩码( & )
    • 使用一系列移位、掩码、加法或按位或操作逐节构建所需的结果

    强制关闭位是通过按位和在(仅)要关闭的位置具有0的掩码来实现的。

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

    您似乎已经有了一个移位的句柄,但是如果您碰巧要移位有符号类型的对象,您确实需要小心。最好尽可能使用无符号类型进行位操作。