- 数学
位运算
- 2022-12-9 11:01:04 @
1.概念
位运算就是 直接对整数在内存中的二进制位进行操作
,因此其执行效率非常高,在程序中使用位运算操作会大大提高程序的性能。
2.常用的运算符
-
(与) 运算规则:
两个二进制位都为1时,结果才为1
例:0001&0100 = 0000,即
-
(或) 运算规则:
两个位都为0时,结果才为0
例:0101|0001 = 0101,即
-
(左移) 运算规则:
各二进制位全部左移若干位,高位丢弃,低位补0
例:0001<<2 = 0100,即
-
(右移) 运算规则:
各二进制位全部右移若干位,对无符号数,高位补0,有符号数,高位补1
例:0100>>2 = 0001,即
-
∧ (异或) 运算规则:
两个二进制位相同为0,相反为1
例:0101 ^ 0110 = 0011,即5 ^ 6 = 3
-
~ (取反) 运算规则:
0变1,1变0
例:~0 = 1
3.运算律
公式名称 | 运算规则 |
---|---|
交换律 | |
结合律(注意结合律只能在同符号下进行) | |
等幂律 | |
零律 |
|
互补律(注意,这不同于逻辑运算) | ~A, ~A |
同一律 |
- 异或运算常用的运算律
名称 | 运算规则 |
---|---|
交换律 | |
结合律 | |
归零律 | |
恒等律 | |
自反性 |
4.高级操作
-
去掉最低位的二进制数:
例:
-
在最低位增加一个0:
例:
-
取末k位:
例:,
5.应用
-
实现乘除法 x << 1 等价于 x * 2,x >> 1 等价于 x / 2
例:
-
判断奇偶性: 奇数的结果为1,偶数的结果为0
例:
原理:偶数,无论是正整数还是负整数,二进制表示时其最低位为0;奇数,无论是正整数还是负整数,二进制表示时其最低位都为1
-
判断最低二进制位是0还是1:
,则最低二进制位为0;,则最低二进制为1
实例:
#include<iostream> using namespace std; int main() { int x = 15;//二进制:1111 if(x & 1) cout << "15的最低二进制为1" << endl; else cout << "15的最低二进制为0" << endl; }
- 交换两个整数:
void swap(int &a, int &b){
a ^= b;
b ^= a;
a ^= b;
}
实例:
#include<iostream>
using namespace std;
void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
int main()
{
int a = 14, b = 20;
swap(a, b);
cout << "交换后a的值为:" << a << endl;
cout << "交换后b的值为:" << b << endl;
return 0;
}
证明: 对于,则 ,根据交换律、结合率以及恒等律,得
6.lowbit函数
-
lowbit函数介绍 lowbit(x)通常与树状数组一起使用,它的作用是返回x在二进制中最低为1所对应的值
例:5 ->101,lowbit(5)= 1(1),
12 -> 1100 ,lowbit(12)= 4(100)
-
实现
int lowbit(int x) { return x & -x; }
12(1100),-12(0100),lowbit(12)= 4
原理,二进制数的负数是正数取反加一
- lowbit函数的应用
-
统计1的个数
实现:
#include<iostream> using namespace std;//求x的二进制数中有多少个1 int lowbit(int x) { return x & -x; } int count(int x) { int ans = 0;//ans记录x的二进制数中有多少个1 while(x) { x -= lowbit(x); ans++;//个数+1 } return ans; }
实例:
#include<iostream> using namespace std;//求x的二进制数中有多少个1 int lowbit(int x) { return x & -x; } int count(int x) { int ans = 0;//ans记录x的二进制数中有多少个1 while(x) { x -= lowbit(x); ans++;//个数+1 } return ans; } int main() { cout << "12的二进制数中有" << count(12) << "个1"; return 0; }
1 条评论
-
UmQvQmU LV 8 @ 2022-12-9 22:23:54
给大佬手动点个赞
- 1