在 C/C++ 中附加位

Appending bits in C/C++

我想将两个无符号 32 位整数附加到 1 个 64 位整数中。我试过这段代码,但它失败了。但是,它适用于将 16 位整数转换为 1 个 32 位

代码:

char buffer[33];
char buffer2[33];
char buffer3[33];

/*
uint16 int1 = 6535;
uint16 int2 = 6532;
uint32 int3;
*/


uint32 int1 = 653545;
uint32 int2 = 562425;
uint64 int3;

int3 = int1;
int3 = (int3 << 32 /*(when I am doing 16 bit integers, this 32 turns into a 16)*/) | int2;


itoa(int1, buffer, 2);
itoa(int2, buffer2, 2);
itoa(int3, buffer3, 2);



 std::cout << buffer << "|" << buffer2 << " = \n" << buffer3 << "\n";

启用16位部分时的输出:

1100110000111|1100110000100 =
11001100001110001100110000100

启用32位部分时的输出:

10011111100011101001|10001001010011111001 =
10001001010011111001

为什么不起作用?谢谢

我看不出这段代码有什么问题。这个对我有用。如果有错误,它在未显示的代码中。

给定代码的版本,使用标准化的类型声明和 iostream 操作,而不是特定于平台的库调用。位操作与给出的示例相同。

#include <iostream>
#include <iomanip>
#include <stdint.h>    

int main()
{
    uint32_t int1 = 653545;
    uint32_t int2 = 562425;
    uint64_t int3;

    int3 = int1;
    int3 = (int3 << 32) | int2;

    std::cout << std::hex << std::setw(8) << std::setfill('0')
          << int1 << " "
          << std::setw(8) << std::setfill('0')
          << int2 << "="
          << std::setw(16) << std::setfill('0')
          << int3 << std::endl;
    return (0);
}

结果输出:

0009f8e9 000894f9=0009f8e9000894f9

按位运算在我看来是正确的。使用位时,十六进制更方便。任何错误(如果有的话)都在问题中未显示的代码中。就 "appending bits in C++" 而言,您的代码中的内容似乎是正确的。

尝试将 buffer3 声明为 buffer3[65]

编辑: 对不起。 但我不明白投诉的内容。 事实上,答案正如预期的那样。您可以从您自己的 16 位输入结果中推断出来。 因为当您将 lsb 中的 32 个“0”位与第二个整数进行或运算时,它将在 msb 中具有前导零(当分配给 atoi 签名中的 32 位 int 时)在 atoi 中被截断(只有整数值等效将在字符串中读取,因此字符串必须以 0X0 结尾,否则它将具有可确定的大小),给出结果。