检查k中1到n之间的所有位是否都设置好了

Checking if all bits in k between 1 to n are set

本文关键字:是否 设置 之间 检查      更新时间:2023-10-16

我在博客上看到一个问题,这个问题的解决方案是检查'k'中的1到n位是否设置。

例如

  • k = 3, n = 2;那么"True",因为k

  • 中设置了第1位和第2位
  • k = 3, n = 3;那么"False",因为k中的第3位没有设置

作者提供的解决方案是:

    if (((1 << (n-1)) ^ (k & ((1 << n)-1))) == ((1 << (n-1))-1))
        std::cout<<"true"<<std::endl; 
    else 
        std::cout<<"false"<<std::endl; 

我不知道这是怎么回事。有人能帮我理解一下吗?

如果你在笔和纸上画出二进制表示,你会看到(1 << (n-1))总是将单个位设置为1 (n -th位),而(1 << n) - 1设置第一个n位。

这些是位掩码;它们被用来通过位操作(&, |^)来操作输入(k)的某些部分。

注意

我认为这个例子太复杂了。这应该足够了:

if ((k & ((1 << n) - 1)) == ((1 << n) - 1))
    ...

或者让它更干净:

unsigned int mask = (1 << n) - 1;
if ((k & mask) == mask)
   ...

(假设kunsigned int类型)