我希望能够反转存储在存储器地址中的位(十六进制)。所以,例如, 0xABCD - > 0xDCBA
我在网上查看了其他解决方案,它们都涉及复杂的位操作,我想看看是否有办法使用字符串表示。
所以我想将0xABCD转换为" 0xABCD"。反转这个字符串(我知道该怎么做),然后转换" 0xDCBA"到0xDCBA。
在C ++上完成新手,所以我有点迷失,其他类似的问题并没有真正帮助。
答案 0 :(得分:4)
所以我想将0xABCD转换为“0xABCD”。反转此字符串(我知道该怎么做),然后将“0xDCBA”转换为0xDCBA。
这不是太难。您可以使用sprintf
将其保存为字符串,并使用sscanf
从字符串中读取。
#include <iostream>
#include <cstdio>
#include <cstring>
int main()
{
char str[20];
int i = 0xABCD;
// Write the number to the string
sprintf(str, "0x%X", i);
std::cout << str << std::endl;
// Reverse string.
// Pretend that I did.
strcpy(str, "0xDCBA");
// Read the number from the string.
sscanf(str, "0x%X", &i);
// Make sure you get the expected output.
std::cout << std::hex << i << std::endl;
}
输出:
0xABCD
dcba
您可以从格式中删除“0x”,以便更容易反转字符串。
sprintf(str, "%X", i);
和
sscanf(str, "%X", &i);
答案 1 :(得分:0)
您想要反转位(二进制数字)还是要反转十六进制数字?你自相矛盾。
0xABCD是二进制1010101111001101,因此将位反转为1011001111010101,即0xB3D5。
通常,要反转数字(在任何基数中),您需要提取数字,反转它们,然后重新打包它们。计算机在内部使用二进制,因此在任何2次幂基础中反转数字相对容易 - 你只需移动并屏蔽它们以提取和移位和按位 - 或者它们重新组合。
unsigned reverse16binary(unsigned val) {
/* reverse bits in a 16-bit binary number */
unsigned rv = 0;
for (int bit = 0; bit < 16; bit++) {
int digit = (val >> bit) & 1; // extract a digit
rv |= digit << (15 - bit); // stick it in the result
}
return rv;
}
unsigned reverse16hex(unsigned val) {
/* reverse hex digits in a 16-bit binary number */
unsigned rv = 0;
for (int bit = 0; bit < 16; bit += 4) {
int digit = (val >> bit) & 0xf; // extract a digit
rv |= digit << (12 - bit); // stick it in the result
}
return rv;
}
unsigned reverse_general(unsigned val, int bits, int base) {
/* reverse base 2**"base" digits in a "bits"-bit binary number
bits must be <= sizeof(unsigned) * CHAR_BIT and a multiple of base
base must be < sizeof(unsigned) * CHAR_BIT */
unsigned rv = 0;
for (int bit = 0; bit < bits; bit += base) {
int digit = (val >> bit) & ((1 << base) - 1); // extract a digit
rv |= digit << (bits - base - bit); // stick it in the result
}
return rv;
}