刪除最右邊的設定位

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..00n - 10bxxxxxx011..11,所以 n & (n - 1)0bxxxxxx000..00