c++ - C++ 中 64 位整数的按位 (Bitshift) 运算

标签 c++ bit-manipulation bit-shift bitwise-or bitboard

我正在尝试处理位板,这需要我在 64 位无符号整数中设置特定位。为了设置位 i,我对有问题的位板执行按位或操作,并使用左移的数字。

#include <stdint.h>
uint64_t kings = 0ULL; // Also tried unsigned long long int before.
kings |= 1 << i;

它从 0 位到 31 位工作正常,但不能用于 32 位到 63 位。我怀疑这是因为右侧的评估恰好是 32 位整数。因此,我尝试了一个临时变量。

uint64_t temp = 0ULL;
temp |= 1 << i;

也许它仍然将右侧计算为 32 位整数,或者这是我无法弄清楚的其他问题。为了输出整数,我使用了 std::bitset<64>。例如:

uint64_t kings = 0ULL;
kings |= 1 << 3;
kings |= 1 << 59;

期望的十进制值:576460752303423496

实际:8

std::bitset<64> x(kings);
std::cout << x;

位值:0000000000000000000000000000000000000000000000000000000000001000

显然,只有国王 |= 1 << 3;工作正常。

总而言之,第 32 位到第 63 位有什么问题,我该如何解决?

最佳答案

您需要使用 1LL在使用 shift operator << 之前作为 64 位值获得 64 位结果:

#include <stdint.h>
uint64_t kings = 0ULL; 
kings |= 1ULL << i;

关于c++ - C++ 中 64 位整数的按位 (Bitshift) 运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30777450/

相关文章:

sql - 按位异或,在 SQL 中固定长度的二进制字符串(240 字节)

c# - uint 中的按位移位

文件流 : when to check for error? 的 C++ 操作

java - 使用按位运算符的两个数字的总和

java - 加上 0xff,需要澄清

c - 如果我们按位移动一个大于其大小的整数会发生什么

c - 使用移位/屏蔽遇到奇怪的行为

c++ - Excel OpenText 方法

c++ - 如何在 C++ 中访问 3D 对象的最小和最大坐标?

c++ - XSD : How to make a polymorphic "list"?