在 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 结尾,否则它将具有可确定的大小),给出结果。
我想将两个无符号 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 结尾,否则它将具有可确定的大小),给出结果。