我想将两个无符号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
为什么不起作用?感谢
答案 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终止,否则它将具有可确定的大小),给出结果。