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

时间:2015-02-23 15:01:32

标签: c++ c binary

编程语言: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; 000

0100 0001 - &gt; 101

如何以最少的操作完成这项工作?

2 个答案:

答案 0 :(得分:4)

您可以通过几个按位操作来实现此目的:

((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
  4. 现在你有3个问题。但请记住,您无法解决单个位,因此它仍将按字节对齐00000YYY

答案 1 :(得分:0)

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

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

(有关StackOverflow的更多详情)

所以你用它来得到1,6和7位,然后加上那些:

r=bit1+bit6*16+bit7*32