在C中使用char类型进行位交换

时间:2010-10-12 18:01:59

标签: c char bit-manipulation swap

数据类型为char,模式如下:

源字节:[0] [1] [2] [3] [4] [5] [6] [7]

目的地:[6] [7] [4] [5] [2] [3] [0] [1]

例如,如果我将char,29传递给此函数,它将进行交换并返回一个char类型值,即116.

如何进行交换?

谢谢。

========================

只是想知道我是否可以这样做?

unsigned char mask = 128;
char num = 0, value1 = 29;
int i, a;

for(i = 0; i < 8; i++) {
  if (i == 0 || i == 1 || i == 6 || i == 7)
    a = 6;
  else
    a = 2;

  if(i < 4)
    num = ((value1 & mask) >> a);
  else
    num = ((value1 & mask) << a);

  result = (result | num);

  if(i<7)
    mask = mask >> 1;
}

7 个答案:

答案 0 :(得分:5)

我通常以另一种方式对我的位进行编号 - 因此位0是LSB。按照你的编号方案:

unsigned char src = 29;
unsigned char dst = 0;
dst = (((src & 0x80) >> 6) | // bit 0
       ((src & 0x40) >> 6) | // bit 1
       ((src & 0x20) >> 2) | // bit 2
       ((src & 0x10) >> 2) | // bit 3
       ((src & 0x08) << 2) | // bit 4
       ((src & 0x04) << 2) | // bit 5
       ((src & 0x02) << 6) | // bit 6
       ((src & 0x01) << 6) // bit 7
      );

当然,除非您以“正确的方式”对它们进行编号,而是将它们“向后” - 然后反转我上面所做的。 (不是说我想在这里开始宗教战争......)

答案 1 :(得分:4)

或查找表

万一你不明白。这里有更多细节

对于256个可能的输入中的每一个输出答案(手动)

然后做

unsigned char answers[256] = {0x00, 0x40,0x21.....};
unsigned char answer = answers[input];

我必须补充一点,我给出的值是一个例子 - 当然不正确

答案 2 :(得分:3)

请参阅Bit Twiddling Hacks上的“转换位序列”部分。

另外,如果你想自己做:

要读取 n 位:int bit = value & (1 << n);如果未设置该位,则bit为0.

设置 n 位:value |= 1 << n;(值=值OR(1位移n位))

清除 n 位:value &= ~(1 << n);(值=值AND NOT(1位移n位))

答案 3 :(得分:1)

首先用低4位交换低4位,然后交换所有相邻位对:

dst = src;
dst = ((dst & 0xF0) >> 4) | ((dst & 0x0F) << 4);
dst = ((dst & 0xCC) >> 2) | ((dst & 0x33) << 2);

答案 4 :(得分:0)

您可能会觉得这很有用:

http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious

但它有点反转并不完全符合你的需要。只需要做一点工作就可以改变“显而易见”的算法来做你想做的事。

答案 5 :(得分:0)

通过随身携带http://en.wikipedia.org/wiki/Bitwise_operation#Rotate_through_carry

所以这会奏效:

myByte = myByte << 2 | myByte >> 6;

答案 6 :(得分:0)

source byte: [01][23][45][67] to
destination: [67][45][23][01]

实现:

unsigned char shiftit( unsigned char in ) {
  unsigned char out;

  out = (
    (( in & 0xC0 ) >> 6) + /* top 2 to bottom 2 */
    (( in & 0x30 ) >> 2) + /* centre-left 2 to centre-right */
    (( in & 0x0C ) << 2) + /* centre-right 2 to centre-left */
    (( in & 0x03 ) << 6)   /* bottom 2 to top 2 */
  );

  return( out );
}

调用shiftit( 29 )时返回116。