编程语言:C
我有一个只有3位的8位数据,例如:
0110 0001
其中0表示始终设置为0的未使用位,1表示更改的位。
我想将此0110 0001 8位转换为3位,表示此3位使用位。
例如
0110 0001 - > 111
<0010> 0010 0001 - &gt; 011 <00> 0000 0000 - &gt; 0000100 0001 - &gt; 101
如何以最少的操作完成这项工作?
答案 0 :(得分:4)
您可以通过几个按位操作来实现此目的:
((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
答案 1 :(得分:0)
你可以得到n的第k位:(其中n是011000001)
(n & ( 1 << k )) >> k
(有关StackOverflow的更多详情)
所以你用它来得到1,6和7位,然后加上那些:
r=bit1+bit6*16+bit7*32