检查k中1到n之间的所有位是否都设置好了
Checking if all bits in k between 1 to n are set
我在博客上看到一个问题,这个问题的解决方案是检查'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)
...
(假设k
是unsigned int
类型)
相关文章:
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 是否有任何区域设置会影响宽字符编码?
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 在编译时间检查模板参数类型是否设置或多键,并且容器的元素类型是算术的
- 标志-检查是否设置了位并且仅设置了这些位
- Oracle 11gR1或R2客户端上是否设置了在ODBC API调用中将SELECT COUNT(*)返回的数据类型从
- 如何调试是否设置了 Windows 事件对象
- 是否设置数组的某些字段,将其他字段设置为零
- 如何集体检查位是否设置在无符号整数中
- 如何判断是否设置了mongoDB directoryperdb
- 检查在unsigned int类型中是否设置了第31位
- 检查客户端在c++中是否设置了callback
- Memcpy/Memmove到工会成员,这是否设置了"活跃"成员?
- 如何在TCL中检查是否设置了有效的x显示
- 是否设置了最高有效位
- C++确定是否设置了变量
- GNU 如何理解是否设置了一个标志