C ++ - 十六进制

时间:2017-04-30 04:09:23

标签: c++ reverse bit

我希望能够反转存储在存储器地址中的位(十六进制)。所以,例如, 0xABCD - > 0xDCBA

我在网上查看了其他解决方案,它们都涉及复杂的位操作,我想看看是否有办法使用字符串表示。

所以我想将0xABCD转换为" 0xABCD"。反转这个字符串(我知道该怎么做),然后转换" 0xDCBA"到0xDCBA。

在C ++上完成新手,所以我有点迷失,其他类似的问题并没有真正帮助。

2 个答案:

答案 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;
}