4.8其他运算符
自增自减:++ --
三目运算符: ? :
复合运算符:+= -= *= /= %=
&= |= ^= <<= >>=
逗号运算符: ,
4.8.1自增自减:++ --
实现变量的+1 或者 -1操作
++:单目运算符
前置:++a
后置:a++
①如果 ++运算符作为单独语句使用++在前,++在后没有区别
②如果 ++ 运算符参与其他运算(表达式中除了++之外还有其他运算符), ++在前--先加后用,++是先用后加。
举例1:
int a = 5; int b = 5; a++; // a = a + 1 ++b; // b = b + 1 printf("%d %d",a,b); // 6 6
举例2:
int a = 5; int b = 5; int c = a++; // 先用a的值作为a++表达式的结果。 c=a; a = a +1; int d = ++b; // 先执行b=b+1=6 , ++b表达式的结果就是 6 d = 6; printf("%d %d",c,d); // 5 6
4.8.2三目运算符: ? :
格式:表达式1?表达式2:表达式3
运算规则:先计算表达式1的值,如果为真,则取表达式2的值作为三目运算符的结果,否则取表达式3的值
样例:求两个数中的最小值
#include<stdio.h> int main() { int a,b; scanf("%d",&a,&b); int c;//存储a,b的最小值 c=a<b?a:b; return 0; }
如果a<b为真,则取a的值作为表达式的结果赋值给c;否则,则取b的值作为表达式的结果 赋值给c。
4.8.3复合运算符:+=、-=
+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
a+=5;等价于a = a+5;
4.8.4逗号运算符: ,
优先级最低,比赋值运算符还要低。
格式:表达式1,表达式2。
规则:从左往右计算,最后一个表达式的结果和类型作为逗号运算符的结果和类型。
样例
#include<stdio.h> int main() { int a = 3; int b = 4; int c = (a++,a+=b,b++); printf("%d",c); //4 return 0; }
练习:输入三个整型数据,使用三目运算符,获取3个数据中的最大值。
#include<stdio.h> int main() { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); d=c>a?c:a; printf("%d",d>b?d:b); return 0; }
4.9位运算符
&、|、~、<<、>>。
4.9.1按位与:&
用法:表达式1&表达式2。
规则:
将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码
按照低位对齐
总结:“全1为1,有0则0”
样例:
10&25(按8位空间存储) 0000 1010——10 0001 1001——25 0000 1000——8 printf("%d",10&25); //8
应用场景:(用它有0则0的规则),将一个数据的二进制某一位置置0。
4.9.2按位或:|
用法:表达式1|表达式2
规则:
将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码。
按照低位对齐。
总结:“有1则1,全0为0”
样例:
10|25(按8位空间存储) 0000 1010——10 0001 1001——25 0001 1011——27 printf("%d",10|25); //27
应用场景:(用它有1则1的规则)将一个数据的二进制某一位置1,其他位不变。
int a;//这里只看低8位
//将第四位置1
xxxx x10x——4
0001 0000——16(0b 0001 0000)
xxx1 x10x——20
printf("%d",4|16); //20
4.9.3左移:<<
用法: 表达式1 << 移动位数
规则:将表达式1的结果运算拿出来,并且还要转成二进制补码, "高位溢出舍弃,低位补0,移动几位就补几个0"
样例:
10 << 1 ---- 20 10*2^1 10 << 2 ---- 40 10*2^2 10 << n ---- 10*2^n
场景:构造任意某一位上是1其他位是0的数: 1 << n
4.9.4右移:>>
用法: 表达式1 >> 移动位数
规则:将表达式1的结果运算拿出来,并且还要转成二进制补码, "高位补符号位数字(无符号则补0),低位溢出舍弃,移动几位就补几个0"
10 >> 1 ---- 5
10 >> 2 ---- 2
10 >> n ---- 10 / 2^n
应用场景:提取一个二进制数据中的某一数据
举例:提取0x67、0x4567
int a = 0x12345678 a >> 4; //0x01234567 unsigned char t = a; unsigned short u = a;
4.9.5按位取反:~
用法: ~表达式
规则:先计算表达式的结果,转为二进制补码
“所有位0变1,1变0”
int a = 10;
int b = ~a;
// b = -11;
场景:构造任意某一位上是0其他位是1: ~(1 << n)
4.9.6按位异或:^
用法:表达式1 ^ 表达式2;
规则:将表达式1和表达式2的结果运算拿出来,并且还要转成二进制补码,按照低位对齐。
总结:“相同为0,不同为1。”
练习:// 控制它的第4位让它的第4位置0和1之间进行翻转。
int a; scanf("%x",&a); a ^= (1 << 4); printf("%x\n",a);
4.10位操作练习题
4.10.1将一个数据a的二进制第n位置0,其他位不变
a &= ~(1 << n);
4.10.2将一个数据a的二进制第n位置1,其他位不变
a |= (1 << n);
4.10.3将一个数据a的二进制的第n+1位和第n位 同时置0,其他位保持不变
a &= ~(3 << n);
4.10.4将一个数据a的二进制第n+1位和第n位置1,其他位不变
a |= (3 << n);
4.10.5将一个数据a的二进制第n+1位和第n位置01,其他位不变
先同时置00,a &= ~(3 << n);
然后再单独置1,a |= (1 << n);
4.10.6将一个数据a的二进制第n+1位和第n位置10,其他位不变
先同时置00,a &= ~(3 << n);
然后再单独置1,a |= (2 << n);
4.10.7将一个数据a的二进制的第n位是0或者1之间进行翻转
a ^= (1 << n);
4.10.8判断一个数据a的第n位是0还是1
#include<stdio.h>
int main()
{
int a;
scanf("%d",a);
if(a & (1 << n))
printf("第n位是1");
else
printf("第n位是0");
return 0;
}
标签:10,二进制,int,day05,C语言,运算符,++,表达式
From: https://blog.csdn.net/m0_56934903/article/details/143425710