找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5113|回复: 0
打印 上一主题 下一主题
收起左侧

C语言运算符的含义集合,~&^!|

[复制链接]
跳转到指定楼层
楼主
&
  
&&
  
(与)
“&”  (都为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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表