反转十六进制字符串C ++的第7位

时间:2012-11-19 12:09:53

标签: c++ c binary hex

  

可能重复:
  Change bit of hex number with leading zeros in C++,(C)

我的这个数字是十六进制字符串:

002A05(7th bit is set to 0)

我需要反转这个数字的第7位,所以转换后我会得到

022A05

但是以防万一

ABCDEF(7th bit is set to 1)

我需要

A9CDEF

但它必须与每6个字符十六进制数一起使用。

它必须是左起第7位。我尝试将OUI转换为修改后的EUI64

我尝试通过strtol将十六进制字符串转换为整数,但该函数会将前导零。

请帮助我如何解决。

4 个答案:

答案 0 :(得分:2)

最简单的方式,但不一定是最干净的;

由于只有一个char受到影响,您可以使用简单的字符串操作来执行此操作;假设您的输入在字符串input;

中是大写的
input[1] = "23016745AB*******89EFCD"[input[1]-48];

答案 1 :(得分:0)

#include <stdio.h>

void flipme(char *buf, const char *inBuf)
{
    int x;
    sscanf(inBuf, "%x", &x);
    x ^= 1 << 17;
    sprintf(buf, "%06X", x);
}

int main(void)
{
    char buf[16];

    flipme(buf, "002A05");
    printf("002A05->%s\n", buf);

    flipme(buf, "ABCDEF");
    printf("ABCDEF->%s\n", buf);
}

输出:

  

002A05-&GT; 022A05
  ABCDEF-&GT; A9CDEF

您写道:

  

我尝试通过strtol将十六进制字符串转换为整数,但该函数会将前导零。

strtol功能将其转换为数字。它没有任何意义说它剥离前导零,因为数字没有前导零 - “6”和“06”是两种不同的写入相同数字的方式。如果您在打印时需要前导零,则可以添加它们。

答案 2 :(得分:0)

num ^ 0x020000

^是按位xor运算符。

答案 3 :(得分:0)

给定整数x,第3位反转的数字为x ^ 2。 答案的其余部分是给你的earlier

注意:在问题中,位从最高到最低计数,从1开始。然后,6位十六进制数的第7位是第2个最高字符的第3位。通常,位从最低到最高计数,从0开始计算。