clhiker
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生!
Home
Categories
Archives
Tags
About
Home
C++ 位操作
C++ 位操作
取消
C++ 位操作
由
clhiker
发布于 2022-03-08
·
最后更新:2022-03-10
### 为什么需要位操作:位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。 ## 运算符 1. & 与,同1为1 2. | 或,同0为0 3. ~ 取反(单目) 4. ^ 异或 相同为0,不同为1 5. << 左移,二进制左移,高位丢弃,低位补0 6. >> 右移,二进制右移,低位丢弃,无符号数高位补0。有符号数,补符号位(算数右移)补0(逻辑右移) **左移,右移看箭头方向** **位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错** **位操作的优先级很低,尽量都加括号** ## 位应用 1. 判断奇偶:奇数的末位是1和1与,结果一定是正 ```c++ if (a & 1){ cout << "偶数"; } ``` 2. 交换 异或自身为0,异或0位自身 ```c++ for (int i=1; i<n; i++){ a ^= b; // a = a^b ; b ^= a; // b = b^a^b=b^b^a=a; a ^= b; // a = a^b^a=a^a^b=0^b; } ``` ## 位移 a << b = a*(2^b) a >> b = a/(2^b) 显然有: a<<1 = 2a a >> 1 = a/2 3. 取出一个32位数字的每一二进制位 ```c++ for(int i=0;i<32;i++){ total[i].append((num[i]>>i) & 1); } ``` 首先右移i位,则右移后最后一位就是第i位数字,然后&1就得到最后一位的结果(前面全是0) 4. 将每一位放入一个十进制数中 ```c++ int res =0; for(int i=0;i<32;i++) if (total[i] == 1) res |= (1 << i) ``` 先将所有位置0,如果该位是1,将数字用1左移到该位,然后|到结果中。
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
wsl 使用经验
十个命令开始玩转docker
node 使用教程
米哈游面试
Verilog语法-1
热门标签
red
文章目录
编译v8
ubuntu 18.04 安装NVIDIA 显卡驱动