C语言学习day17-----位运算
目录
1.位运算
1.1基础知识
1.1.1定义
1.1.2用途
1.1.3软件控制硬件
1.2运算符
1.2.1与 &
1.2.2或 |
1.2.3非 ~
1.2.4异或 ^
1.2.5左移 <<
1.2.6右移 >>
1.2.7代码实现
1.2.8置0
1.2.9置1
1.2.10不借助第三方变量,实现两个数的交换
1.2.11实现循环左移
1.位运算
1.1基础知识
1.1.1定义
二进制位上的运算
1.1.2用途
1)系统软件开发
2)硬件操作控制
3)加密解密
1.1.3软件控制硬件
通过软件实现对CPU相关寄存器中二进制位的控制,进而影响硬件上电平的高低变化
1.2运算符
1.2.1与 &
1)运算优先级:结合性
2)运算规则: 一假则假
3)示例
eg:
unsigned char a=0x55;
unsigned char b=0x33;
a&b
a=0x55------>0101 0101
b=0x33------>0011 0011
0101 0101 //a
& 0011 0011 //b
----------------------------------
0001 0001 //0x11
1.2.2或 |
1)运算规则:一真则真
2)示例
eg:
unsigned char a=0x55;
unsigned char b=0x33;
a|b
a=0x55------>0101 0101
b=0x33------>0011 0011
0101 0101 //a
| 0011 0011 //b
----------------------------------
0111 0111 //0x77
1.2.3非 ~
1)运算规则:真假相对
2)示例
eg:
unsigned char a=0x55;
unsigned char b=0x33;
a~b
a=0x55------>0101 0101
b=0x33------>0011 0011
~ 0101 0101 //a
1010 1010 //0xaa
----------------------------------
~ 0011 0011 //b
1100 1100 //0xcc
1.2.4异或 ^
1)运算规则:相同为0,不同为1
2)示例
eg:
unsigned char a=0x55;
unsigned char b=0x33;
a&b
a=0x55------>0101 0101
b=0x33------>0011 0011
0101 0101 //a
^ 0011 0011 //b
----------------------------------
0110 0110 //0x66
1.2.5左移 <<
1)运算规则:m<<n 表示将m中的二进制位向左移动n位,最右边空出来的位置补0
2)示例
eg:
unsigned char a=0x55;
a<<1
0101 0101 //a
01010 01010 //0xaa
3)注意
左移只是运算,并不影响运算数本身
1.2.6右移 >>
1)运算规则:m>>n 表示将m中的二进制位向右移动n位
2)示例
eg:
unsigned char a=0x55;
a>>1
0101 0101 //a
step1: 0101 0101 //最后一位丢失
step2: 0101 010
step2: 0010 1010 //0x2a
3)根据数据类型操作
右移要看左操作数的数据类型是否是有符号的
有符号的右移 signed------最高位补符号位 //算术右移
无符号的右移 unsign-------最高位补0
1.2.7代码实现
有符号与无符号----------->
打印结果--------->
1.2.8置0
1)操作
a & ~(1<<10) //第10位置0
2)代码实现
eg:第10位置0
eg:第3,5,7位置0
eg:偶数位置0
1.2.9置1
1)操作
a | (1<<10) //第10位置1
2)代码实现
eg:所有奇数位置1
1.2.10不借助第三方变量,实现两个数的交换
1)方法一
- 使用方法:
a=a+b;
b=a-b;
a=a-b;
- 代码实现:
2)方法二:异或
- 使用方法:
a=a^b;
b=a^b;
a=a^b;
- 代码实现:
3)两个方法区别
浮点型数据不能作位运算----即浮点型不能使用方法二
1.2.11实现循环左移
1)用法
a<<1
2)基本思路
a.先判断最高位是1还是
b.是1-------->左移
最低位+1
c.是0-------->直接左移
3)代码实现