刪除最右邊的設定位
C 風格的位操作
template <typename T>
T rightmostSetBitRemoved(T n)
{
// static_assert(std::is_integral<T>::value && !std::is_signed<T>::value, "type should be unsigned"); // For c++11 and later
return n & (n - 1);
}
說明
- 如果
n
為零,我們的0 & 0xFF..FF
為零 - 別的
n
可以寫成0bxxxxxx10..00
而n - 1
是0bxxxxxx011..11
,所以n & (n - 1)
是0bxxxxxx000..00
。