| “&” (都为1时,结果是1,否则是0) 按位与,将两个二进制的数逐位相与,结果是相与之后的结果 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。 | 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 例如:9&5可写算式如下:(9的二进制补码)&(5的二进制补码) 9&5=1 00001001&00000101=00000001 位数不对称可补码; 254&1=254 11111110&00000001=11111110 “&&” 逻辑与 判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假 a=1;b=0; a&&b a&&b a和b都为真时 式子才返回true,否则就返回false | | “|” (有1时,结果是1,都是0时,结果为0) 参加运算的两个对象,按二进制位进行“或”运算 运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; 即 :参加运算的两个对象只要有一个为1,其值为1。 例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。 “||” a||b ,只有在前一个条件a为假,才会去判断条件b ;若条件a为真,则条件b不会执行 a||b ,a或者b有一个为真时,式子就返回true,都为就假才返回false。 | | 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。 格式:需要移位的数字 << 移位的次数 例如:3<<2; 3转换为二进制是0011,所有数字左移2个位置,空位补0,得到1100,即十进制数12。
| | 右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。 按二进制把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位(正数补零,负数补1)。 格式:需要移位的数字 >> 移位的次数 例如:11 >> 2 1011>>2=0010; 11的二进制为1011,所有数向右移2个位置,因为11是正数,所以高位补0,得0010,是十进制的2。 注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
|
提醒: 移位运算符是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。 数学意义: 1、在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 2、右移一位相当于除2,右移n位相当于除以2的n次方。 | | 参加运算的两个数据,按二进制位进行“异或”运算。 运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0; 即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为 0。 “异或运算”的特殊作用: (1)使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。
例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。
| | “~”按位取反(二进制数) 位运算符将数字视为二进制值,并按位进行相应运算,运算完成后再重新转换为数字。对于整形变量,对每一个二进制位进行取反,0变1,1变0。 “!”:是逻辑运算符,用于从左到右求表达式的真值。 |
|
|
|
|
C语言的32个关键字可以分为以下4类:
1 、数据类型关键字(12个): (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) 2、控制语句关键字(12个): A循环语句 (1) for:一种循环语句 (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环 B条件语句 (1)if: 条件语句 (2)else :条件语句否定分支(与if 连用) (3)goto:无条件跳转语句 C开关语句 (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支 D返回语句 return :子程序返回语句(可以带参数,也可不带参数) 3 、存储类型关键字(4个): (1)auto :声明自动变量 一般不使用 (2)extern:声明变量是在其他文件正声明(也可以看做是引用变量) (3)register:声明寄存器变量 (4)static :声明静态变量 4 、其它关键字(4个): (1)const :声明只读变量 (2)sizeof:计算数据类型长度 (3)typedef:用以给数据类型取别名 (4)volatile:说明变量在程序执行中可被隐含地改变
二、用途 按位与的用途 1.清零 若想对一个存储单元清零,即使其全部二进制位为0,只要对这个存储单元当前的值取反(也就是原来的数中为1变为0,0变为1),然后使二者进行&运算,即可达到清零目的。
比如a=23,b=~a: a:00010111 b:11101000 a&b:00000000 2.取一个数中某些指定位 比如a=23,我想取a的二进制的后面4位数,那么可以找一个后4位是1其余位是0的数b,即b=0x0f(十六进制,转换为二进制为00001111),a&b就得到了a的后四位。 a:00010111 b:00001111 a&b:00000111 3.保留指定位 比如a=23(用8bit表示),我想保留其二进制的第4和第6位(最左边为第1位),其余位置0。那么可以找一个第4和第6位是1其余位是0的数b与a进行按位与运算 a:00010111 b:00010100 a&b:00010100 按位或的用途 常用来对一个数的某些位置1,其余位不变。比如a=23,我想将其第2和第3位置为1,可以找一个第2、3位是1其余位是0的数与a进行按位或运算。 a:00010111 b:01100000 a|b:01110111 三、项目实例 在实际项目中,很多时候&和|都是和>>、<<配合使用的。比如在蓝牙项目开发中,2个设备之间进行日期数据传输时,我们先定一个协议,用4个byte来表示一个日期,其中byte0表示年份的高位数,byte1表示年份的低位数,byte2表示月份,byte3表示日期。
设备端现在收到另外一台设备传过来的日期数据00010100 00010011 0000011000011101(为了阅读方便我将每个byte之间用空格分开)。那么我要如何解析这个数据来得到实际日期呢? /* *第一步,获取日期。 *日期是最后一个byte,也就是最后8位,用一个后8位是1其余位是0的数(11111111,十六进制表示是0xff)与数据进行按位与计算即可 */ date = 00010100 00010011 00000110 00011101; day = date & 0xff;(计算结果是00011101,十进制表示是29,也就是日期是29)。
/* *第二步,获取月份。 *月份是倒数第2个byte,此时需要先将最后一个byte砍掉(也就是右移8位),然后再和0xff进行按位与运算 *下面代码可以简写成date=date>>8&0xff; */ date = date>>8; (计算结果是00010100 00010011 00000110) month = date & 0xff;(计算结果是00000110,十进制表示是6,也就是月份是6月)。
/* *第三步,获取年份低位。 *先将最后一个byte砍掉(也就是右移8位),然后再和0xff进行按位与运算 *下面代码可以简写成date=date>>8&0xff; */ date = date>>8; (计算结果是00010100 00010011) year_low = date & 0xff;(计算结果是00010011,十进制表示是19)。
/* *第四步,获取年份高位。 *先将最后一个byte砍掉(也就是右移8位),然后再和0xff进行按位与运算 *下面代码可以简写成date=date>>8&0xff; */ date = date>>8; (计算结果是00010100) year_heigh = date & 0xff;(计算结果是00010011,十进制表示是20)。 最后将4个数拼起来就得到日期为2019年6月29日。
完整的Word格式文档51黑下载地址:
运算符的含义.docx
(98.53 KB, 下载次数: 40)
|