将 8 位数据转换为 3 位数据

Convert an 8 bit data to 3 bit data

编程语言:C

我有一个 8 位数据,只使用了 3 位,例如:

0110 0001

其中 0 表示始终设置为 0 的未使用位,1 表示更改的位。

我想将这个 0110 0001 8 位转换为 3 位,表示这 3 个已使用的位。

例如

0110 0001 --> 111

0010 0001 --> 011

0000 0000 --> 000

0100 0001 --> 101

我怎样才能用最少的操作做到这一点?

你可以得到n的第k位:(其中n是011000001)

(n & ( 1 << k )) >> k

(更多详情请见 Whosebug

因此您可以使用它来获取位 1,6 和 7 并添加它们:

r=bit1+bit6*16+bit7*32

您可以通过几个按位运算来实现:

((a >> 4) & 6) | (a & 1)

假设您从 xYYx xxxY 开始,其中 x 是您不关心的一点,而 Y 是要保留的一点:

  1. a 左移 4 将导致 xYYx,然后使用 6(二进制 110)进行掩码将确保只有第二和第三位是保留,导致 YY0 并防止翻转的 x 位弄乱。
  2. a & 1 选择 LSB,导致 Y
  3. YY0Y 这两个部分使用 | 按位或组合,得到 YYY.

现在你得到了你要求的 3 位。但请记住,您无法寻址单个位,因此它仍将按字节对齐为 00000YYY