位运算符
定义
位运算是对整型数据进行的运算,而且符号位需要参与运算,主要用于编写系统软件,完成汇编语言能够完成的一些功能
分类
含义 | 运算符 | 举例 | 结果 |
---|---|---|---|
按位与 | & | 3&5 | 1 |
按位或 | l | 3l5 | 7 |
按位异或 | ^ | 3^5 | 6 |
按位取反 | ~ | ~3 | -4 |
左移 | << | 3<<1 | 6 |
右移 | >> | 3>>1 | 1 |
结果验证
#include<stdio.h>
int main
{
printf("%d\n",3&5);
printf("%d\n",3|5);
printf("%d\n",3^5);
printf("%d\n",~3);
printf("%d\n",3<<1);
printf("%d\n",3>>1);
输出结果
1
7
6
-4
6
1
注意
1.仅按位取反运算是单目运算符,其余皆为双目运算符
2.位运算先将运算的整数转换为二进制再进行运算,运算结果再转换为整数(十进制)
运行分析
按位与
按位与“&”运算符,将两个运算量对应的二进制逐一按位进行逻辑与运算。每一位二进制数都要参与运算,包括符号位。
运算规则
二进制按位对应后,全真(1)则真(1),有假(0)则假(0)
按位或
按位或“|”运算符,将两个运算量对应的二进制逐一按位进行逻辑或运算。每一位二进制数都要参与运算,包括符号位
运算规则
二进制按位对应后,有真(1)则真(1),无真(1)则假(0)
按位异或
按位异或“^”运算符,将两个运算量对应的二进制逐一按位进行逻辑异或运算。每一位二进制数都要参与运算,包括符号位
运算规则
二进制按位对应后,相异为真,相同为假
按位取反
按位取反是一元运算符,其结果将运算量的每个二进制位逐一取反,包括符号位
运算方法
例:+3
转化为二进制:~00000011
进行逐一取反 :11111100
由于首位为1是负数,以补码形式表示(七位二进制):–1111100
该负数补码在c程序中得到机器数需在数字部分每位取反,末位加一:–0000011 + 1
最后得到机器数:–0000100
转化为十进制:-4
左移
左移运算符是一个双目运算符,需两个运算量参与且都为整数,如a<<n其意义是将a按照二进制位向左移动n位,变量a二进制的最高位n位舍弃,最低的n位用0补齐
运算方法
例:3<<1
3:00000011
左移后 :00000110
3的二进制向左移动1位:00000011X
最高位(最左位)的0舍去,最低位(最右位)X用0补齐:00000110
转化为十进制:+6
右移
右移运算符是双目运算符,需两个运算量参与且都为整数,如a>>n其意义是将a按照二进制位向右移动n位,变量a二进制的最低位n位舍弃,最高的n位补齐数值由运算符类型决定,若是有符号整数则补齐符号位(正为0,负为1),若是无符号整数则补齐0,与左移类似
自增、自减运算符
定义
两者都是特殊的算术运算符,同时也是一元运算符,只能对变量进行运算
用法
++i,–i 在使用i之前,先使i的值加/减1(先增减,后运算)
i++,i-- 在使用i之后,使i的值加/减1(先运算,后增减)
例子
int i=3,j;
j=++i;//i的值先变成4,再赋给j,j的值为4
输出验证:
int i=3;
printf("%d",++i);//输出4
int i=3,j;
j=i++;//先将i的值3赋给j,j的值为3,然后i变成4
输出验证:
int i=3;
printf("%d",i++);//输出3
结合性
自右向左
例子
如:i=2, j=-i++
等价于:j=-(i++)
即 :j =-i ; i=i++
由于“++”和“- -”是同优先级,所以结果j的值是-2 ,i的值是3
程序验证:
#include(stdio.h)
int main()
{
int j,i=2;
j=-i++;
print("j=%d,i=%d",j,i);
}
输出结果为:
j=-2,i=3
注意点
1.谨慎使用该两种运算符,只用最简单的形式,即i++,i–,且把它们作为单独的表达式使用,
不与其他运算符结合运算,减少难度
2.自增自减运算,常用于循环语句,是循环变量加或减1;以及指针变量中,是指针指向下或上一个地址
3.自增自减运算符不能用于长量和表达式
总结
简要总结位运算符和自增自减运算符