作者:冠凯雅友9 | 来源:互联网 | 2023-05-30 17:38
一、基本知识(一)位bit运算符位与&运算符特点位或|运算符特点(二)移位运算符(三)位运算符和移位运算符结合(bit位清0与置1公式)二、例程(一清0与置1推导步骤(
一、基本知识(一)位bit运算符位与&运算符特点位或|运算符特点(二)移位运算符(三)位运算符和移位运算符结合(bit位清0与置1公式) 二、例程 (一)清0与置1推导步骤 (二)借助数组将某一位清0和置1 (三)使用指针清0和 置1 一、基本知识
(一)位(bit)运算符
1、功能:这些运算符就是专门操作内存中的二进制数
位与:&(目的:将二进制数的bit清0)位或:|(目的:将二进制数的bit置1)
2、位与(&)运算符与 位或(|)运算符
(1)位与&运算符特点
语法:C = A & B
规律:任何数跟0做位与,结果为0,任何数跟1做位与,保持原值
例如:
数字 2进制 16进制 A 01011010 0x5A B 11100111 0xE7 &-------------------- C 01000010 0x42
(2)位或|运算符特点:
语法:C = A | B
规律:任何数跟1做位或,结果为1,任何数跟0做位或,保持原值
例如:
数字 2进制 16进制 A 01011010 0x5A B 11100111 0xE7 |-------------------- C 11111111 0xFF
(二 )移位运算符
1、功能:将二进制数整体向左边或者向右边移动N个位置
分两种:
左移:A<
>B 语义:将A右移B个位置 例如:
char a = 0x5a; //a=0x5a=01011010 char b = a <<2; //b=a<<2=0x5a<<2=01011010<<2 = 01101000 = 0x68 printf("a = %#x b = %#x\n", a, b); //a = 0x5a, b = 0x68 b = a >> 2; //b = a >> 2 = 0x5a >> 2 = 01011010>>2=00010110 = 0x16 printf("a = %#x b = %#x\n", a, b); //a = 0x5a b = 0x16 a = 0xa5; //a = 0xa5 = 10100101 b = a >> 2; //b = a >> 2 = 0xa5 >> 2 = 10100101>>2=11101001=0xE9 printf("a = %#x b = %#x\n", a, b); //a = 0xa5 b = 0xe9
2、移位运算符特点
1.向左移动后右边空出来的数据用0来填充 0x5a <<2 = 01011010 <<2 = 01101000 2.无符号类型数字右移时左边空出来的数据用0来填充 unsigned char a = 0xa5; a >> 2 = 10100101 >> 2 = 00101001 3.有符号类型数字右移时左边空出来的数据用符号位来填充 char a = 0xa5; a >> 2 = 10100101 >> 2 = 11101001 4.移位运算符不会修改变量本身的值 5.只要将来有2的多少次方处理的代码,建议用移位操作 例如: 3*4; //垃圾代码,CPU运行*,/的效率极低 3<<2; //高薪代码,CPU运行移位操作效率极高 12/4; //不推荐 12>>2; //推荐
(三)位运算符和移位运算符结合
1、实际开发常见的场景:位清0和位置1
2、给出以下位操作公式:
(1)清0公式:
1.将某个数据A的第n位清0,其它位保持不变: A &= ~(0x1 <
(2)置1公式: 1.将某个数据A的第n位置1,其它位保持不变: A |= (0x1 <二、例程 (一)清0与置1推导步骤
1-1、清零
代码截图如下:
1-2、清零
代码截图如下
2-1、置1
(二)、借助 数组将某一位清零和置一
(三)、使用指针清零和 置1