将 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
是要保留的一点:
a
左移 4 将导致 xYYx
,然后使用 6
(二进制 110
)进行掩码将确保只有第二和第三位是保留,导致 YY0
并防止翻转的 x
位弄乱。
a & 1
选择 LSB,导致 Y
。
-
YY0
和 Y
这两个部分使用 |
按位或组合,得到 YYY
.
现在你得到了你要求的 3 位。但请记住,您无法寻址单个位,因此它仍将按字节对齐为 00000YYY
编程语言: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
是要保留的一点:
a
左移 4 将导致xYYx
,然后使用6
(二进制110
)进行掩码将确保只有第二和第三位是保留,导致YY0
并防止翻转的x
位弄乱。a & 1
选择 LSB,导致Y
。-
YY0
和Y
这两个部分使用|
按位或组合,得到YYY
.
现在你得到了你要求的 3 位。但请记住,您无法寻址单个位,因此它仍将按字节对齐为 00000YYY