c - 在 C 中设置最高有效位

标签 c bit-manipulation

我正在尝试设置 long long unsigned x 中的最高有效位。 为此,我使用了这行代码:

x |= 1<<((sizeof(x)*8)-1);

我认为这应该可行,因为 sizeof 以字节为单位给出大小,所以我乘以 8 并减去 1 来设置最后一位。每当我这样做时,编译器都会发出警告:“警告:左移计数 >= 类型宽度”

我不明白为什么会出现这个错误。

最佳答案

您正在移动的 1int 类型的常量,这意味着您正在将 int 值移动 sizeof(unsigned long long) * 8) - 1 位。这种转变很容易超过 int 的宽度,这显然是您的情况。

如果你想获得一些 unsigned long long 类型的位掩码掩码,你应该从 unsigned long long 类型的初始位掩码开始,而不是int 类型。

1ull << (sizeof(x) * CHAR_BIT) - 1

可以说构建相同掩码的更好方法是

~(-1ull >> 1)

~(~0ull >> 1)

关于c - 在 C 中设置最高有效位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31233452/

相关文章:

c - 为什么 recvfrom 在选择过程后返回错误的 IP?

c - 如何找到某种类型的所有赋值表达式

c - 在ajax调用中显示Json数据

c++ - Boost库中用于动态位集的硬件支持的popcount

更改字节中的特定位集

c - 如何同时使用 openmp 和 AVX2 获得完美答案?

c - 内存分配代码错误

c - 使用有限的按位运算符在 C 中提取字符位

c - 与左移运算符 (<<) 的结果不一致

c - 解释类型转换如何在 C 中从 int 到 short 的位级别工作