基本思想:
我们知道计算机中的数在内存中都是以二进制形式进行存储的 ,而位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中使用位运算进行操作,会大大提高程序的性能。在有些dp等问题中,灵活运用数的二进制来表示某种状态可以大大降低代码的复杂度,位运算很多时候可以将我们的问题简单化,但是并不容易想到,需要一定的积累和对位运算知识的熟练掌握。
lowbit原理:根据计算机负数表示的特点,如一个数字原码是011111000,他的负数表示形式是补码,也就是反码+1,反码是10000111,加一则是10001000,二者按位与得到了1000,就是我们想要的lowbit操作,即得到最后一位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<iostream> using namespace std; const int N=100010; int n; /*int lowbit(int x) { return x&-x; }//得到最后一位1 */ int main() { cin>>n; while(n--) { int res=0; int x; cin>>x; /* while(x) { x-=lowbit(x); res++; } */ for (int i = x; i; i -= i & -i) res++; cout<<res<<" "; } return 0; }
例题:
137. 只出现一次的数字 II - 力扣(LeetCode)
ps:真难想到怎么用位运算去解题啊