我在使用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
中的位)。
我做错了什么?
答案 0 :(得分:5)
问题是这些转换是使用类型int
完成的,在所有现代64位系统上仍然是32位。您需要使用与map
相同的类型,即unsigned long long
:
1ull << pos
请注意ull
告诉编译器1
不是int
而是unsigned long long
。