在C / C ++中附加位

时间:2016-03-17 01:36:46

标签: c++ bit-manipulation bit

我想将两个无符号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

为什么不起作用?感谢

2 个答案:

答案 0 :(得分:4)

我发现这段代码没有错。这个对我有用。如果有错误,则代码中没有显示。

给定代码的版本,使用标准化类型声明和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

按位操作对我来说是正确的。使用位时,十六进制更方便。任何错误(如果有的话)都在代码中未显示在问题中。就“在C ++中添加位”而言,代码中的内容似乎是正确的。

答案 1 :(得分:2)

尝试将buffer3声明为buffer3 [65]

编辑: 抱歉。 但我不明白投诉的内容。 事实上,答案正如预期的那样。您可以根据自己的结果推断出16位输入。 因为当您使用第二个整数在lsb中输入32'0'位时,它将在msb中具有前导零(当分配给atoi的签名中的32位int时)在atoi中被截断(仅等于整数值)将在字符串中读取,因此字符串必须是0X0终止,否则它将具有可确定的大小),给出结果。