#include<stdio.h>
void wei();
void yiwei();
void sanmu();
void changdu();
int main() {
wei();
sanmu();
changdu();
yiwei();
return 1;
}
void wei() {
printf("\n==============位运算=============\n");
/*
位运算
反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
补码
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
*/
int i = 3;
int j = 2;
/*
按位与运算
规则:两个运算量中对应位都是1,则该位的结果值为1,否则为0
*/
int k1 = i & j;
/*
0000 0011
0000 0010
&
0000 0010
= 2
*/
printf("\n%d & %d = %d", i, j, k1);
/*
按位或运算
规则:两个运算量中对应位只要有一个为1,则该位的结果值为1,否则为0
*/
int k2 = i | j;
/*
0000 0011
0000 0010
|
0000 0011
= 3
*/
printf("\n%d | %d = %d", i, j, k2);
/*
按位异或运算
规则:两个运算量中对应位不同,则该位的结果值为1,否则为0
*/
int k3 = i ^ j;
/*
0000 0011
0000 0010
^
0000 0001
= 1
*/
printf("\n%d ^ %d = %d", i, j, k3);
/*
取反运算
规则:一个运算量的每一位都取反
*/
int m = 7;
/*
0000 0111
~
1111 1000(最高位为符号位)
注意: 有符号整数在计算机中采用补码存储,即1111 1010为所求整数的补码
负数的补码 = 原码 取反(除符号位) + 1
所以 原码 = 补码 - 1 取反
补码 = 1111 1000
反码 = 补码 - 1 = 1111 0111
原码 = 反码取反 = 1000 1000 = -8
*/
int k4 = ~m;
printf("\n~%d = %d", m, k4);
}
void yiwei() {
printf("\n=====================移位运算=====================\n");
/*
右移位运算:
变量名 >> 右移位数
每右移一位,相当于/2
左移位运算:
变量名 << 左移位数
每左移一位,相当于*2
注意:
对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1;
若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:
*/
int i = 8;
int m = 2;
int j = i >> m;
/*
i = 0000 1000
i >> 2 = 0000 0010 = 2
*/
printf("\n%d >> %d=%d", i,m,j);
int k = i << m;
/*
i = 0000 1000
i << 2 = 0010 0000 = 32
*/
printf("\n%d << %d=%d", i, m, k);
i = -8;
j = i >> m;
/*
原码i = 1000 1000
反码i = 1111 0111
补码i = 1111 1000
补码i >> 2
补码k = 1111 1110
反码k = 1111 1101
原码k = 1000 0010 = -2
*/
printf("\n%d >> %d=%d", i, m, j);
k = i << 2;
/*
原码i = 1000 1000
反码i = 1111 0111
补码i = 1111 1000
补码i << 2
补码k = 1110 0000
反码k = 1101 1111
原码k = 1010 0000 = -32
*/
printf("\n%d << %d=%d", i, m, k);
}
void sanmu() {
printf("\n=================三目条件运算==================\n");
/*
三目条件运算
基本形式:e1?e2:e3
规则:若e1为真,则整个表达式结果值取e2,否则整个表达式结果取e3。
*/
int a = 1;
int b = 2;
int c = a > b ? a : b;
printf("\n%d = %d > %d ? %d : %d", c, a, b, a, b);
}
void changdu() {
printf("\n=================长度运算===================\n");
/*
sizeof是取数据类型或变量的存储长度的运算符(以字节为单位)
格式是:
sizeof(数据类型说明符或变量名)
*/
int a = sizeof(double);
printf("\nsizeof(double)=%d", a);
}
执行结果:
==============位运算=============
3 & 2 = 2
3 | 2 = 3
3 ^ 2 = 1
~7 = -8
=================三目条件运算==================
2 = 1 > 2 ? 1 : 2
=================长度运算===================
sizeof(double)=8
=====================移位运算=====================
8 >> 2=2
8 << 2=32
-8 >> 2=-2
-8 << 2=-32