如何找到数字的第 3 位

How to find the 3rd bit of a number

我有一个关于 C++ 的问题。 我必须创建一个程序,我必须从 Int 创建一个变量,如果第 3 位为 1,则在屏幕上输出 << 为“True”。

我的问题是:我怎样才能看到那个数字的第3位是多少?我试过 bitset,但无法解决。请帮助我。

#include<iostream>
#include<bitset>
using namespace std;
int main()
{
int x; cin >> x;

if (x % 3 != 0 && bitset<32>(1)[2])
{
    cout << "TRUE";
}
else
{
    cout << "FALSE";

} 这应该做对吗?

这取决于“第三位”是从左数第三位还是从右数第三位。在任何一种情况下,我都会使用移位(>> 运算符)将“第三位”移动到第一个位置,而不是使用 AND(& 运算符)和 1。如果该位已设置,AND 将 return 1,如果该位未设置,AND 将 return 0.

在伪代码中:

x = 0b1011101
          ^ counting this one as the third bit
x = x >> 2 (x is now 0b10111)
is_third_bit_set = x & 1

并将return1,如:

  10111
& 00001
-------
  00001

检查给定位是否已设置是您会在很多代码库中遇到的经典模式。因此,即使在现代 C++ 中有更简洁的方法来做到这一点,仍然值得至少在弹出时识别旧学校模式:

// You will typically see bit masks predefined in constants or an enum.
enum flags {
  FEATURE_1 = 1 << 0,  // first bit
  FEATURE_2 = 1 << 1,  // second bit
  FEATURE_3 = 1 << 2,  // third bit
  FEATURE_4 = 1 << 3,  // fourth bit
};

if(value & FEATURE_3) {
  // the bit is set
}
else {
  //the bit is not set
}

解释:

(1 << bit_index):这会创建一个掩码。 IE。一个只有我们关心的位的值。例如。 1 << 30b00001000 作为 8 位整数。

val & mask:这会在值和掩码之间进行二进制 AND,当且仅当该位未设置时,掩码将为 0。由于任何非零值都是 true,我们只使用 & 的结果作为条件。

您也可以移动值并与 1 进行比较,但反过来的好处是掩码通常可以在编译期间预先计算,因此检查在运行时变为简单的二进制 AND .

如今,使用 std::bitset:

更简洁
// Replace 4 with the number of meaningful bits
// N.B. index is still 0-based. 1 means the second bit.
if(std::bitset<4>(value).test(2)) {
  // the bit is set
}
else {
  //the bit is not set
}