【问题标题】:Bit Operators to append two unsigned char in C++在 C++ 中附加两个无符号字符的位运算符
【发布时间】:2008-11-02 18:19:18
【问题描述】:

如果我有两个十六进制的东西,我可以将他们的二进制文件附加在一起以获得一个值吗?

在 C++ 中, 说我有

unsigned char t = 0xc2;  // 11000010
unsigned char q = 0xa3;  // 10100011

我想要的是某种方式, 1100001010100011,这可以使用按位运算符吗?

我想提取 t 和 q 的二进制形式并附加它们...

【问题讨论】:

    标签: c++ bit-manipulation bit bit-shift


    【解决方案1】:

    是的,这是可能的。

    只需使用 left-bitshift 运算符,向左移动 8 位,至少使用 16 位整数。然后二进制或第二个值到整数。

    unsigned char t = 0xc2; // 11000010 
    unsigned char q = 0xa3; // 10100011
    unsigned short s = (((unsigned short)t)<<8) | q; //// 11000010 10100011
    

    或者将两个值放在包含 2 个字符的联合中(注意大端或小端)将具有相同的位级别结果。另一种选择是 char[2]。

    【讨论】:

    • 在你的最后一句话中,假设你正在谈论将一个 char[2] 与一个 short 联合起来,这取决于字节序。
    • 另外,如果你在 unsigned char 上使用
    • @OJ。 C 数学运算将 chars 和 short 提升为 int,因此无需强制转换
    【解决方案2】:

    连接两个字符:

    unsigned char t = 0xc2;  // 11000010
    unsigned char q = 0xa3;  // 10100011
    
    int result = t;  // Put into object that can hold the fully concatenated data;
    result <<= 8;     // Shift it left
    result |= q;     // Or the bottom bits into place;
    

    【讨论】:

      【解决方案3】:

      您的示例并不能很好地工作,因为输入值的宽度(通常为 8 位)未定义。例如,为什么不是您的示例:0000000100000010,这将真正按位附加 1 (00000001) 和 2 (00000010)。

      如果每个值都有固定宽度那么可以用位移和ORing值来回答

      编辑:如果您的“宽度”定义为删除所有前导零的完整宽度,则可以使用移位和 ORing,但更复杂。

      【讨论】:

        【解决方案4】:

        我会使用 char 数组。

        无符号短小号; 字符 * sPtr = &s; sPtr[0] = t; sPtr[1] = q;

        这并不真正关心字节序.. 我不确定您为什么要这样做,但这会起作用。

        位方法的问题在于您不确定自己的大小。 如果你知道尺寸.. 我会选择 Brians 的答案

        【讨论】:

          【解决方案5】:

          二进制/十六进制中没有追加,因为您正在处理数字(您可以追加 1 和 2 并且不会将结果 12 与“真实”12 混淆吗?)

          你可以用一些特殊的符号来分隔它们,但你不能只是“连接”它们。

          【讨论】:

            【解决方案6】:

            对于数字来说,作为一个操作追加并没有什么意义,不管它们的基数是什么。使用 .作为连接运算符:在您的示例中, 0x1 。如果连接十六进制,0x2 变为 0x12,如果连接二进制,则变为 0b101。但是 0x12 和 0b101 不是同一个值(以 10 为底,它们分别是 18 和 5)。一般来说,A O B(其中 A 和 B 是数字,O 是运算符)应该得到相同的值,无论您在什么基础上进行操作。

            【讨论】:

            • 他在二进制中要求它=P。这是一个定义明确的操作。这在做霍夫曼编码之类的事情时实际上也很有用。
            猜你喜欢
            • 2013-05-23
            • 2011-09-29
            • 2012-04-03
            • 1970-01-01
            • 2013-03-19
            • 2013-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多