目录
1、操作符分类
算术操作符:+、-、*、/、%
移位操作符:<<、>>
位操作符:&、|、^、~
赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=
单目运算符:!、++、--、&、|、*、~、+、-、sizeof
关系运算符:>、>=、<、<=、==、!=
逻辑操作符:&&、||
条件运算符:?:
逗号表达式:,
下标引用:[]
函数调用:()
2、进制转换
我们常说的2进制,8进制,10进制,16进制其实是数值不同的表达形式;
如:15的不同进制表示:
2进制:1111
8进制:17
10进制:15
16进制:F
我们日常生活中大部分使用的是10进制;
1、10进制中满10进1
2、10进制中的数字每一位都是由0~9组成
同理,其他进制也是如此;
2进制:
(1)满2进1
(2)2进制中的数字每一位都是由0~1组成
8进制:
(1)满8进1
(2)8进制中的数字每一位都是由0~7组成
16进制:
(1)满16进1
(2)16进制中的数字每一位都是由0~9和a,b,c,d,e,f组成
(其中a表示10,b表示11,c表示12,d表示13,e表示14,f表示15)
其中8进制一般是0开头,18进制一般是0x开头
int main()
{
int a = 0xF;//十六进制
int b = 012;//八进制
printf("%d\n", a);
printf("%d", b);
}
有了以上基础,我们就可以进一步去掌握进制转换
2.1 2进制转10进制
对于一个二进制:1101,它的每一位权重,从右往左:2^0,2^1,2^2,2^3……借助下面的表格对1101的每一位权重进行理解。
2进制的位 | 1 | 1 | 0 | 1 | |
权重 | 2^3 | 2^2 | 2^1 | 2^0 | |
权重值 | 8 | 4 | 2 | 1 | |
求值 | 1*8+1*4+0*2+1*1=13 |
2.1.1 10进制转2进制
2.2 2进制转8进制
2进制转8进制也可以利用权重的方法来计算,下面是一个比较简单的方法;
对于二进制:01101011
总结:
从右边序列低位开始向左,每3个二进制会换算出一个8进制,剩余不足3个的,直接换算;
2.3 2进制转16进制
还是以二进制:01101011为例,与转8进制类似,只不过这个是每4个二进制换算出一个16进制;
3、原码,反码,补码
整数二进制表示方法:原码,反码,补码
有符号整数:三种表示方法均匀符号位
(其中’0‘表示正,’1‘表示负)
原码:将一个整数转换成二进制形式,就是其原码。
反码:对于正数,它的反码就是其原码(原码和反码相同);负数的反码是将原码中
除符号位以外
的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。补码:对于正数,它的补码就是其原码(原码、反码、补码都相同);负数的补码是其反码加 1。
我们根据下面的代码来理解和求一个数的原码,反码,补码;
int main()
{
int num1 = 10;
//10是存放在整型变量num1中,占4个字节,32个bite位
//0 0000000000000000000000000001010------原码
//0 0000000000000000000000000001010------反码
//0 0000000000000000000000000001010------补码
int num1 = -10;
//-10是存放在整型变量num1中,占4个字节,32个bite位
//1 0000000000000000000000000001010------原码
//1 1111111111111111111111111110101------反码(符号位不变,其他位全部取反)
//1 1111111111111111111111111110110------补码(反码加1)
}
4、移位操作符
移位操作符包括:<<(左移操作符),>>(右移操作符)
它们只能对整数进行移位操作;
4.1 左移操作符
简单概括一下就是:左边抛弃,右边补0
举例讲解:
int main()
{
int n = 10;
int m = n << 1;//左移一位
printf("m=%d\n", m);
printf("n=%d\n", n);
}
n=10时:
4.2 右移操作符
移动规则:右移运算分成两种:
1.逻辑右移:左边用0补充,右边抛弃
2.算术右移:左边用原该值的符号位补充,右边抛弃
其用哪一种运算取决于编译器,大部分编译器采用的是算术右移;
int main()
{
int n = -10;
int m = n >> 1;//右移一位
printf("m=%d\n", m);
printf("n=%d\n", n);
}
注意:
对于移位运算符,不能移动负数位:
int n=10;
n>>-1;//错误写法
5、位操作符
位操作符包括:
&:按位与;只要有0就是0,全为1才是1
|:按位或;有一个1就是1
^:按位异或;相同为0,不同为1
~:按位取反;全部取反,符号位也要取反
注:位操作符操作的都是二进制位,操作数必须是整数;
举例来解释一下:
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("c=%d\n", c);
//00000000000000000000000000000011 ------3的补码
//10000000000000000000000000000101 ------ -5的原码
//11111111111111111111111111111010 ------ -5的反码
//11111111111111111111111111111011 ------ -5的补码
//00000000000000000000000000000011 ------3的补码
//按位与运算:只要有0就是0,全为1才是1
//00000000000000000000000000000011
c = a | b;//按位或运算
//有一个1就是1
//11111111111111111111111111111011 补码
//10000000000000000000000000000101 原码
//------ - c = -5
printf("c=%d\n", c);
c = a ^ b;//按位异或运算
//相同为0,不同为1
//11111111111111111111111111111000 补码
//10000000000000000000000000001000 原码
//----c=-8
printf("c=%d\n", c);
}
int main()
{
int a = 1;
int b = ~a;//按位取反(全部取反,符号位也要取反)
printf("b=%d\n", b);
//00000000000000000000000000000001 a的补码
//11111111111111111111111111111110 a取反==>b
//10000000000000000000000000000010 b的原码
//---b=-2
}
5.1 例题
不创建临时变量(第三个变量),实现两个整数的交换。
方法一:
int a = 3;
int b = 5;
printf("a==%d,b==%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a==%d,b==%d\n", a, b);
方法二:
a = a ^ b;
b = a ^ b;//a^b^b==a^0==a(还是原来的a)
a = a ^ b;//a^b^a==b^0==b
printf("a==%d,b==%d\n", a, b);
//异或运算:
// a^a=0;
//0^a=a;
5.2例题
求一个整数在内存中的二进制1的个数
方法一:
若a:00000000000000000000000000001010
1:00000000000000000000000000000001
a&1:00000000000000000000000000000000
若a:00000000000000000000000000000101
1:00000000000000000000000000000001
a&1:00000000000000000000000000000001
由此可知:当一个数的二进制的最右边为1时,这个数&1的结果是1
当一个数的二进制的最右边为0时,这个数&1的结果是0
int main()
{
int a;
scanf("%d", &a);
int sum = 0;
for (int i = 1; i <= 32; i++)
{
if (a & 1 == 1)sum++;
a = a>>1;//依次右移一位
}
printf("%d", sum);
}
方法二:
我们先看a&(a-1)这个表达式有什么规律?
假设一个数a为15:
a:1111
a-1:1110
a&(a-1):1110
a:1110
a-1:1101
a&(a-1):1100
a:1100
a-1:1011
a&(a-1):1000
a:1000
a-1:0111
a&(a-1):0000
由此可知:a&(a-1)这个表达式每次都可以去掉二进制中数值为1的一位
int main()
{
int a;
scanf("%d", &a);
int sum = 0;
while (a)
{
a = a & (a - 1);
sum++;
}
printf("%d", sum);
}
6、逗号表达式
逗号表达式就是用逗号隔开的多个表达式,从左到右,依次执行,整个表达式的结果是最后一个表达式的结果;
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d\n", c);
}
7、下标引用操作符,函数调用操作符
int add(int x, int y)
{
return x + y;
}
int main()
{
int arr[10] = { 0 };
arr[5] = 9;//[]----下标引用操作符
//arr和5是两个操作数
int c = add(1, 2);//()函数调用操作符,函数名和参数就是操作数
//test() 函数名就是操作数,最少有1个操作数
}
注意:
sizeof并不是函数,而是操作符;
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d", sizeof a );
}
sizeof(a)和sizeof a 效果相同;且()可以去掉,说明sizeof并不是函数,因为函数的()不可以省略。
8、优先级
部分优先级(由高到低)
圆括号:()
自增自减运算符:++,--
单目运算符:+和-
乘除:*、/
加减:+、-
关系运算符:<、>
赋值运算符:=
逗号表达式最低
以上就是有关操作符的相关内容,希望有所帮助!