C 钻头电镀

C 钻头电镀,c,bit-manipulation,bit-shift,C,Bit Manipulation,Bit Shift,我想获取输入,例如0xaabbccdd,并将其转换为DDCCBBAA或转换输入OxF0F0T0F0。我编写的下一个代码设法将F0转换为0F0F #include <stdio.h> #include <stdlib.h> int main(void) { int number; scanf("%x",&number); if(number > 1){ number = (~number); print

我想获取输入,例如0xaabbccdd,并将其转换为DDCCBBAA或转换输入OxF0F0T0F0。我编写的下一个代码设法将F0转换为0F0F

#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;
}
#包括
#包括
内部主(空){
整数;
scanf(“%x”和编号);
如果(数字>1){
number=(~number);
printf(“十六进制数是%x十进制数是(%d)”,数字,数字);
}
返回0;
}

您是否想知道在实际应用中实现这一点的最佳方法,或者您是否只是想了解它是如何工作的,这并不十分明显

假设前者:

  • 如果这是针对网络/主机字节顺序,则使用
    htonl
    ntohl
    表示32位数量,使用
    htons
    ntohs
    表示短路

  • 如果这不是网络/主机字节顺序,我们可以使用它们的代码。当需要交换时,它们使用
    bswap32
    bswap16
    功能。这些可通过
    bswap_32
    bswap_16
    界面获得-只需
    \include

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

#define __bswap_constant_32(x) \
     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) |               \
      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
#定义uu bswap_常量32(x)\
(((x)和0xff000000)>>24)|((x)和0x00ff0000)>>8)|\

((x)和0x0000ff00)为了让人们提供帮助,请给出输出并解释什么是你想要的,什么不是你想要的。因此,基本上你想交换尾数?你似乎没有在你的帖子中包含问题。此外,你似乎没有在这里包含足够的信息,无法从你令人困惑的陈述中提取有意义的问题。请澄清您的查询。对不起,您是对的。我想问最实际的是什么,为什么要这样做并理解它。我想要输入0xAABB并转换为bbaabb。我正在学习,所以我想了解它的工作原理和实际方法。您需要非常小心的一件事是符号扩展。当您正确移动未签名的(char、short、int、long、long-long等),以前最高有效位左侧的位总是用零填充。当右移负数(即最高有效位设置为1)时,左侧的所有新位都将设置为1。当字节交换时,这是不可取的。因此…先移位,然后屏蔽掉您不关心的位。不要这样做,否则您会自找麻烦。实际上,当右移位有符号负整数时,符号位发生的情况是实现定义的。您的实现艾尔乔农·埃德尔森,这很公平,但我从来没见过不保留这个标志的。