将左移运算符与数字右侧的值一起使用

Using Left Shift operator with ones at the right of the number

我不太熟悉位运算符,我有这个用例:当我们在 C++ 中使用左移运算符 << 时,数字将被移位,0 将被放置在数字的右边,我想在右边放 1 而不是零。 我的意思是如果我有一个数字 00000000 并且我将 << 3 结果需要是 00000111 而不是 0 !

那就不是左移了

您必须自己将这些位设置为 1

简单的方法是将 1 左移您要设置的位数,然后减去 1

(1 << n) - 1

例如

cout << (1 << 2) - 1 << '\n'; // prints 3
cout << (1 << 3) - 1 << '\n'; // prints 7
cout << (1 << 4) - 1 << '\n'; // prints 15
cout << (1 << 5) - 1 << '\n'; // prints 31

但请注意,这仅在 n 小于整数中的位数时有效。否则就是未定义的行为。

这是一个适用于任何数字的解决方案:

int one_shift(int val, int n) {
    return ~(~0 << n) | (val << n);
}

细分:

  • ~0 计算结果为 0xFFFFFFFF 例如全 1
  • ~0 << n 将 0xFFFFFFFF 移动 N 位,得到一个末尾有 N 个零的数字
  • ~(~0 << n) 翻转所有这些位,得到一个只设置了最后 N 位的数字
  • | (val << n) 然后对我们的原始数字进行常规左移 N 位,并通过与我们的其他值进行或运算来设置最后 N 位

另外,这里有一个适用于任何整数类型的版本:

template<typename T>
T one_shift(T val, int n) {
    return ~(~static_cast<T>(0) << n) | (val << n);
}