C 钻头电镀
我想获取输入,例如0xaabbccdd,并将其转换为DDCCBBAA或转换输入OxF0F0T0F0。我编写的下一个代码设法将F0转换为0F0FC 钻头电镀,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
#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
表示32位数量,使用ntohl
和htons
表示短路ntohs
- 如果这不是网络/主机字节顺序,我们可以使用它们的代码。当需要交换时,它们使用
和bswap32
功能。这些可通过bswap16
和bswap_32
界面获得-只需bswap_16
\include
/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。当字节交换时,这是不可取的。因此…先移位,然后屏蔽掉您不关心的位。不要这样做,否则您会自找麻烦。实际上,当右移位有符号负整数时,符号位发生的情况是实现定义的。您的实现艾尔乔农·埃德尔森,这很公平,但我从来没见过不保留这个标志的。