一.AND &运算
注:两个操作数做&运算结果是不会变大的
二.OR |运算
注:两个操作数做|运算结果是不会变小的
三.XOR(异或) ^运算
注:结果可能变大也可能变小也可能不变,但是不会导致进位,比如两个四位的数字做运算是不会算出五位的。
四.按位取反~
五.左移<<
注:左移操作不要移动到符号位,或者干脆使用无符号数
左移多少位就是相当于乘以2的多少次方
六.右移>>
低位上有1就不要了
注:相当于除以2的幂次方再向下取整
七.判断数字的奇偶性
公式:x & 1
结果为1就是奇数,为0就是偶数。
伪代码:
int x = 10;//01010
//判断奇偶性
if (x & 1 == 1)
{
cout << "奇数" << endl;
}
else
{
cout << "偶数" << endl;
}
八.获取二进制数的某一位
公式:x>>i&1
将二进制数右移,将我要的这位数放在最后一位,然后与1作&
伪代码:
int x = 10; //01010
//获取二进制数的某一位 01010
cout << "10的二进制数01010第三位为:" << (x >> 3 & 1) << endl;
九.将二进制数的某一位修改为1
公式:x | (1 << i)
将1也就是00001左移x位,比如左移两位那就是00100,然后作 | 操作,加到x的0上
伪代码:
int x = 10; //01010
cout << "10的二进制数01010,将最高位修改为1的结果为:" << (x | (1 << 4)) << endl;
十.快速判断一个数是否是2的幂次方
公式:x & (x - 1)
伪代码:
int x = 10;
bool flag = x & x - 1;
if (!flag)
cout << "是二的幂次方" << endl;
else
cout << "不是二的幂次方" << endl;
十一.获取二进制位中的最低位的1
公式:lowbit(x) = x & -x
complement:
//#include<bits/stdc++.h>
#include<iostream>
using namespace std;
int main()
{
int x = 10;//01010
//判断奇偶性
if (x & 1 == 1)
{
cout << "奇数" << endl;
}
else
{
cout << "偶数" << endl;
}
//获取二进制数的某一位 01010
cout << "10的二进制数01010第三位为:" << (x >> 3 & 1) << endl;
//将二进制数的某一位修改为1
cout << "10的二进制数01010,将最高位修改为1的结果为:" << (x | (1 << 4)) << endl;
//快速判断一个数是否为2的幂次方 x & (x - 1)
bool flag = x & x - 1;
if (!flag)
cout << "是二的幂次方" << endl;
else
cout << "不是二的幂次方" << endl;
int lowbit = x & -x;
//获取二进制中最低位的1 lowbit(x) = x & -x
cout << lowbit << endl;//000010
return 0;
}
十二.例题
12.1 给定一个整数x,输出这个整数的二进制表示中的1的个数
#include<iostream>
using namespace std;
int main()
{
int x = 11;//01011
int ans = 0;
while (x)
{
if (x & 1)
ans++;
x >>= 1;
}
cout << ans << endl;
return 0;
}