将左移运算符与数字右侧的值一起使用
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);
}
我不太熟悉位运算符,我有这个用例:当我们在 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);
}