位操作

时间:2014-02-10 20:13:32

标签: c bit-manipulation bit-shift

我想获取输入,例如0xaabbccdd并将其转换为DDCCBBAA或转换输入oxf0f0 t0 F0F0。我编写的下一个代码设法将f0f0f0转换为0f0f0f。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

     int number;

     scanf("%x",&number);

     if(number > 1){
     number = (~number);
     printf("Number hex is %x decimal is (%d) ",number,number);

    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您是否想知道在实际应用中执行此操作的最佳方式,或者您是否只想弄清楚它是如何工作的,这并不是很明显。

假设前者:

  • 如果这是针对网络/主机字节顺序的,请将htonlntohl用于32位数量,将htonsntohs用于短路。< / p>

  • 如果这不是网络/主机字节顺序,我们可以窃取^ Wreuse他们的代码。当需要交换时,它们使用__bswap32__bswap16函数。这些通过bswap_32bswap_16界面提供 - 只需#include <byteswap.h>

假设您对它的工作原理感兴趣,请查看Linux机器上的/usr/include/bits/byteswap.h,您将看到优化的byteswapping例程。这是一个:

#define __bswap_constant_32(x) \
     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |               \
      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))

这是显而易见的方法。

还有一个巧妙的技巧,你可以用XOR来交换各组的位。请参阅:http://graphics.stanford.edu/~seander/bithacks.html#SwappingBitsXOR