第十一章 位运算
第一节 位的概念以及位运算符介绍
1. 位的概念
一个int型数据是占4个字节内存,一个char型数据占用1个字节内存
一个字节是由八个位组成,是由二进制位,最左边称为最高位,最右边称为最低位
每一个二进制位的值是0或者1(二进制数只有0,1,两个数字,没有其他数字): 00000000-11111111 ==> 0-255
intabcd;//占四个字节// int能表示的最大二进制数是多少呢?11111111,111111111,11111111,11111111=2^32-12. 位运算符介绍
- 针对二进制位进行运算的
| 位运算符 | 含义 |
|---|---|
| & | 按位与 |
| | | 按位或 |
| ^ | 按位异或 |
| ~ | 取反 |
| << | 左移 |
| >> | 右移 |
- 按位与运算符&:参加运算的两个运算量,如果两个相应的位都为1,则该位的结果为1,否则为0,跟逻辑运算符&&有点像
0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1 unsigned int tempvalue= 38 & 22 100110 // 38 010110 // 22 ------------- 000110 //6- 按位或运算符|:参加运算的两个运算量,如果两个相应的位有一个为1,则位的结果为1,全零则为0,跟逻辑运算符||有点像
0 & 0 = 0 1 & 0 = 1 0 & 1 = 1 1 & 1 = 1 unsigned int tempvalue= 38 | 22 100110 // 38 010110 // 22 ------------- 110110 // 54- 按位异或运算符^:参加运算的两个运算符,如果两个相应的位相同,则结果为0,不同则为1
0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0 unsigned int tempvalue= 38 ^ 22 100110 // 38 010110 // 22 ------------- 110000 // 48 0111 1010 //跟1做异或,能够翻转某些位, 如果想保留某些位,就跟0做异或- 按位取反运算符~:单目运算符,只有一个运算量,对一个数字按位取反
~0 = 1 ~1 = 0 unsigned int tempvalue= ^38 00000000 00000000 00000000 00100110 -------------------------------------- 11111111 11111111 11111111 11011001- 左移运算符<<:将一个数的二进制位左移若干位,右侧补0,每左移一位,都相当于原来的10进制数乘以2
unsigned int tempvalue= 15 << 1; // 30 01111 ------ 11110 unsigned int tempvalue= 15 << 2; // 60 001111 ------ 111100- 右移运算符>>:将一个数的二进制位右移若干位,左侧补0,每右移一位,都相当于原来的10进制数除以2,
超出最低位的被舍弃
unsigned int tempvalue= 15 >> 1; // 7 1111 ---- 0111 unsigned int tempvalue= 15 >> 2; // 3 1111 ---- 0011- 位运算符和赋值运算符可以结合使用,比如&=, |=, ^=, >>=, <<=, 就是复合运算符
a &= b // a = a & b int a = 35; int b = 22; a &= b;// a = a & b ==> a = 2 100011 010110 ------ 000010