常用操作一:
n 的二进制表示中第 k 位(从0位开始算)是几
基本思路
- 先把 n 第 k 位数字移到最后一位,用右移运算 n>>k
- 看个位数字是几,其实就是 x & 1
实际就是:n>>k&1
//最低为从0位算起
#include<iostream>
#include<cstring>
using namespace std;
int main() {int n, k;cin >> n >> k;cout << (n >> k & 1) << endl;return 0;
}
常用操作二:lowbit(x)
lowbit(x)
作用
返回 x 的最后一位 1,返回的是一个二进制数,此数的最高位的 1 就是 x 的最后一位 1(数的最右边的 1 )。
例子
x=1010 lowbit(x)=10
x=101000 lowbit(x)=1000
实现: x & -x
-x = ~x+1
x&-x = x&(~x+1)
例子
x = 1010......100......0
~x = 0101......011......1
~x+1 = 0101......100......0
x&(~x+1)=0000......100......0
按位取反是所有位都取反,包括符号位
基本应用
统计 x 中 1 的个数
思想
每次把 x 的最后一位 1 去掉,当 x=0 时,x 里面就没有 1 了,减去多少次,就说明 x 中有几个 1
例题:二进制中1的个数
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数
输入格式
第一行包含整数n
第二行包含n个整数,表示整个数列
输出格式
共一行,包含n个整数,其中的第i个数表示数列中的第i个数的二进制表示中1的个数
数据范围
1<=n<=100000
0<=数列中元素的值<=10^9
输入样例
5
1 2 3 4 5
输出样例
1 1 2 1 2
#include<stdio.h>
int lowbit(int x)
{return x & -x;
}
int main()
{int n, x,res=0;scanf("%d", &n);while (n--){scanf("%d", &x);while (x){x = x - lowbit(x); //每次减去x的最后一位1res++;}printf("%d ", res);res = 0;}return 0;
}
举例说明
x 1111 x 1010
~x 0000 ~x 0101
~x+1 0001 ~x+1 0110
x&(~x+1) 0001 x&(~x+1) 0010