在C中设置和清除位

时间:2015-11-14 17:25:05

标签: c bit-manipulation bits

我在使用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中的位)。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

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

1ull << pos

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