在 C 中设置和清除位

Setting and clearing bits in C

我在执行一些位操作的 C 程序时遇到了一些问题。在程序中,我用一个unsigned long long int变量来表示一个64位的地图,每一位代表地图上的一个位置。我需要能够更新这些位(位置),即设置或清除位。 要清除和设置位,我这样做(0 是最不重要的位置):

map &= ~(1 << pos) // clear bit in position 'pos'
map |= (1 << pos) // set bit in position 'pos'

问题是,当我执行这些操作时,映射中 pos 左侧的所有位都设置为 0(而我只想要位置 pos 中的位改变)。

我做错了什么?

问题是这些移位是使用类型 int 完成的,在所有现代 64 位系统上仍然是 32 位。您需要使用与 map 相同的类型,即 unsigned long long:

1ull << pos

注意 ull 告诉编译器 1 不是 int 而是 unsigned long long.