可能重复:
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将十六进制字符串转换为整数,但该函数会将前导零。
请帮助我如何解决。
答案 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开始计算。