【问题标题】:Invert 7th bit of hex string C++ [duplicate]反转十六进制字符串C ++的第7位[重复]
【发布时间】:2012-11-07 08:36:20
【问题描述】:

可能重复:
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 将十六进制字符串转换为整数,但该函数去除了前导零。

请帮我解决一下。

【问题讨论】:

  • 这与您几天前询问的another question 几乎相同。能不能根据前面的建议自己动手,遇到问题再贴代码?
  • 您确实必须努力提出具体问题。另外,这是 C++ 问题还是 C 问题?你说的“有这个号码”是什么意思?你有什么形式的?
  • strtol 函数在 C89 中。它早于 C++。
  • 顺便说一句,这不是第七位。

标签: c++ c binary hex


【解决方案1】:

给定一个整数x,第三位反转的数字是x ^ 2。 剩下的答案给你earlier

注意:在问题中,位从高到低计数,从 1 开始。那么 6 位十六进制数的第 7 位是其第二高字符的第 3 位。通常位是从最低到最高计数,但从 0 开始。

【讨论】:

    【解决方案2】:
    #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->022A05
    ABCDEF->A9CDEF

    你写道:

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

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

    【讨论】:

    • 我试图这样做,但由于可能存在前导零,我无法转换它
    • 然后从最右边的六个字符开始工作到左边。或者,继续添加前导零,直到字符串长度为 6 的倍数。
    • 完全没有必要拆分任何东西。 OP只需要修改第二个字符。
    • @KarolisJuodelė:如果它只是一个字符串,他只需将其读入一个整数,翻转该位,然后将其写回十六进制。没有比这更容易的了。
    • @DavidSchwartz,我知道我的挑剔是不合理的,但您肯定必须同意翻转一点十六进制数字字符串,您只需要一个字符。其余的无关紧要。我认为指出这一点很重要,以防 OP 需要对 100 个十六进制数字执行相同操作。
    【解决方案3】:

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

    由于只有一个字符受到影响,您可以使用简单的字符串操作来完成;假设您的输入在字符串 input 中是大写的;

    input[1] = "23016745AB*******89EFCD"[input[1]-48];
    

    【讨论】:

    • 如果输入只有一个字符,比如“4”怎么办?
    • @DavidSchwartz 要求是“它必须使用每 6 个字符的十六进制数字。”但是,是的,它显然会与一个字符中断。
    • OP 对此感到困惑。他不明白数字不是由字符组成的,也不存在十六进制数字之类的东西。十六进制是一种表示数字的方法,一旦以特定的基数表示,就由数字组成。粗略地说,他的意思是一个能够用六个十六进制数字表示的数字。数字 4 可以用六个十六进制数字表示——000004。(我也误读了 OP,直到他多次回复我的答案。)
    【解决方案4】:
    num ^ 0x020000
    

    ^ 是按位异或运算符。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2021-06-27
      • 2016-12-27
      • 2012-07-21
      • 2018-01-31
      • 2017-03-09
      • 1970-01-01
      • 2011-05-15
      • 2012-01-24
      相关资源
      最近更新 更多