文章目录
10 位的概念以及位运算的介绍
10.1 位的概念
//一个int型数据占4个字节内存;一个char型数据占1个字节内存
char abc = 'A';
// 1byte = 8 bit ,
1个字节由8个二进制位组成。 最左边的称为最高位,
每一个二进制位的值是0或者1
能表示的范围二进制是 00000000 - 11111111(十进制的0-255)
例如:
unsigned int abcd = 190;
//占4个字节,能表示的最大二进制是 32位的1.
11111111 11111111 11111111 11111111 = 4294967295(十进制)
10.2位运算符介绍
针对二进制来说的位
位运算都是按其定义的类型进行的
& 按位与
按位或
-
^ 按位异或
- 取反
<< 左移
右移
& 按位与
参加运算的两个运算量,如果两个相应的位都为1,则该位的结果为1,
否则为0,
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;
1 & 1 = 1;
如何计算两个十进制数的位运算呢?
- 将十进制转换为二进制
- 将二进制右对齐,
- 根据按位与的运算规则进行计算
- 得出结果
例如:
unsigned int temp = 38 & 22;
100110; //38
010110; //22
---------
000110; // 6
| 按位或
参加运算的两个运算量,如果相应的有一个1,则该位的结果为1,否则为0
有 1 则 1 ,无1则0
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
unsigned int tmp = 38 | 22;
100110; //38
010110; //22
-----------
110110; //54 //结果为54
^ 按位异或
参加运算的两个运算量,如果两个相应的位相同,则结果为0.否则为1,
如下:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
unsigned int tmp = 38 ^ 22;
100110; //38
010110; //22
----------
110000; //48 结果为48
~ 按位取反(特殊的一类)
单目运算符,只有一个运算量,用来对一个数字按位取反,0变1,1变0
unsigned int tmp = ~38;
00000000 00000000 00000000 00100110
---------------------------------------
11111111 11111111 11111111 11011001 //取反的结果
此处的0不能省略,因为取反是将其类型的所有位进行取反。
<< 左移运算符
将一个数的二进制位左移若干位,右侧补0.
每左移一位都相当于 原来的10进制数 * 2
十进制数 ∗ 左移位 数 2 十进制数 * 左移位数^2 十进制数∗左移位数2 = 左移的值
unsigned int tem = 15 << 1; // 15 * 2
01111 // 15
左移-------------
11110 // 30
unsigned int tmp = 15 << 2; // 15 * 2 *2
001111 // 15
111100 // 60
unsigned int tmp = 15 << 3; // 15 * 2 * 2 * 2
0001111 // 15
1111000 //
>> 右移运算符
将一个数的二进制位右移若干位 , 左边高位补0;
每右移一位都相当于 除以2
unsigned int tmp = 15 >> 1;
1111 // 15
0111 // 7 //被舍弃了
unsigned int tmp = 15 >> 2;
1111 // 15
0011 // 3
位运算符和赋值运算符 可以结合使用
eg:
复合赋值运算符
&=
|=
<< =
=
^=
int a = 35;
int b = 22;
a &= b ; // a = a&b
100011 // 35
010110 // 22
--------------按位与运算
000010 // 2 结果为2