本文用于记录个人算法竞赛学习,仅供参考
目录
一.n的二进制表示中第k位x
二.通过lowbit操作返回x的最后一位1
1.lowbit实现:x & (-x)
2. lowbit具体作用
一.n的二进制表示中第k位x
n = 15 = (1111)2
操作:1.x = n >> k;
2.x & 1 --> 答案
int bit_k(int n, int k)
{
int x = n >> k;
return x & 1;
}
在此基础上可以求得n的二进制表示:
int bit_k(int n, int k)
{
int x = n >> k;
return x & 1;
}
//计算比特位数
int countBits(int n)
{
int x = n;
int count = 0;
while (x > 0)
{
count++;
x = x >> 1;
}
return count;
}
//转换成二进制
void bit(int n)
{
int len = countBits(n);
if (len == 0)
{
cout << 0 << endl;
return;
}
for (int i = len - 1; i >= 0; i--)
{
cout << bit_k(n, i);
}
}
二.通过lowbit操作返回x的最后一位1
1.lowbit实现:x & (-x)
原理: -x == ~x + 1(取反加一),有x & (~x + 1), ~x会使原来的1变为0,0变为1,再+1会使~x最后一位0变(也就是x的最后一位1)为1,再将(~x + 1)&x就可以得到最后一位1。
模板:
int lowbit(int x)
{
return x & (-x);
}
2. lowbit具体作用
lowbit可以用于求一个二进制数的1的个数
int lowbit(int x)
{
return x & (-x);
}
int count_1(int x)
{
int count = 0;
int n = x;
while (n)
{
count++;
n -= lowbit(n);
}
return count;
}