操作符
算术操作符
- +
- -
- *
- /
- % 浮点型运算不支持取模运算
移位操作符
-
整数在内存中以补码的方式存在
- 正数的补码是源码
- 负数的补码是源码的反码+1
-
>>
-
算术右移
- 右边丢弃,左边补原符号位
- 无符号类型右移右移都是“逻辑移位”
有符号类型右移为“逻辑移位”右移为“算术移位”
-
逻辑右移
- 右边丢弃,左边补0
-
-
<<
-
左移
- 左边丢弃(符号位不变),右边补0
-
位操作符
-
&
-
位与运算(按位与)
- 整型二进制位相同(1和1)则取1,否则取0
-
-
|
-
位或运算(按位或)
-
整型二进制位相同或不同(1和1或1和0或0和1)取1,否则取0
-
-2 | 1
1000 0000 0000 0000 0000 0000 0000 0010 -2
1111 1111 1111 1111 1111 1111 1111 1101 -2反码
1111 1111 1111 1111 1111 1111 1111 1110 -2补码0000 0000 0000 0000 0000 0000 0000 0001 1 源码
1111 1111 1111 1111 1111 1111 1111 1110 -2 补码1111 1111 1111 1111 1111 1111 1111 1111 | (补码)
1000 0000 0000 0000 0000 0000 0000 0001 源码
-
-
-
-
^
-
位异或运算(按位异或)
- 整型二进制位不同(1和0或0和1)取1,否则取0
-
-
例题
- 例题1:不创建临时变量交换a、b两值
- 解题1
//不创建临时变量交换a、b的值
int a = 3;
int b = 5;
printf("a = %d,b = %d", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a = %d,b = %d",a ,b);
/*--------------------------------------------*/
- 解题2(优化解题一)
//不创建临时变量交换a、b的值
int a = 3;
int b = 5;
printf("a = %d,b = %d", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d,b = %d",a ,b);
例题2:求一个整数在内存中1的个数。
- 解题一
int num = 0;
scanf("%d",&num);
int count = 0;
while (num){
if (num % 2 == 1){
count