【问题标题】:Setting and clearing bits in CC中的设置和清除位
【发布时间】:2015-11-14 17:25:04
【问题描述】:

我在使用进行一些位操作的 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 中的位)。

我做错了什么?

【问题讨论】:

  • 尝试使用1ULL 确保掩码大小正确。
  • 这已经被问过好几次了。问题在于1 的类型。

标签: c bit-manipulation bits


【解决方案1】:

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

1ull << pos

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

【讨论】:

  • 非常感谢。我知道这与数据类型有关,但我不知道如何使用与地图相同的类型进行转换。
猜你喜欢
  • 1970-01-01
  • 2023-02-14
  • 2015-08-05
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多