c++位运算
目录
常见的位运算
与&
或|
按位异或^
按位取反~
按位左移<<
按位右移>>
位运算技巧
1.判断数字奇偶性
2、获取二进制中的某一位
3、修改二进制中的某一位为1
4、快速判断一个数字是否为2的幂次方
5、获取二进制位中最低位的1
例题 二进制中1的个数
位运算简介
位运算是一种对二进制数的位进行操作的运算方式
它直接对二进制数的每一位进行逻辑操作,而不考虑整个数的数值大小,一般情况下,位运算中每一位都相互独立,各自运算得出结果(左右移位)除外
在计算机科学和编程中,位运算经常考察异或的性质、状态压缩、与位运算有关的特殊数据结构、构造题等。
注意:位运算只能应用于整数,且一般为非负整数,不能应用于字符、浮点等类型。
常见的位运算
与&
& 两个操作数都为1时结果为1,否则为0
或|
|两个位中,一个为1,结果就为1
按位异或^
^当两个位不同时,结果位为1,否则为0
按位取反~
0变1 1变0
按位左移<<
往高位移动,低位补0
例如,对于整数5(00000101),执行左移3位操作,相当于执行5*(2^3)
按位右移>>
相当于对原数除以2的幂次方操作
位运算技巧
1.判断数字奇偶性
x&1 如果结果是1说明是奇数,反之偶数
2、获取二进制中的某一位
x>>i&1 结果必然为1or0,表示x中的第i位
3、修改二进制中的某一位为1
x|(1<<i)
4、快速判断一个数字是否为2的幂次方
x&(x-1) 如果是2的幂次方为0,因为:如果x是2的幂次方,x-1就有很多个连续的1且和x的1没有交集,两者运算一定为0,且其他情况必然不为0
5、获取二进制位中最低位的1
lowbit(x) = x&-x 如果x=(010010),则lowbit(x)=(000010)常用于结构树状数组中。
例题 二进制中1的个数
输入一个十进制正整数n,输出n的二进制中1的个数。
#include<iostream>
using namespace std;
int main()
{unsigned int x; cin >> x;int ans = 0;while (x){if (x & 1)ans++;x >>= 1;}cout << ans << endl;return 0;
}