--上述操作符中,学过了算术、赋值、逻辑、条件以及部分单目操作符,今天继续学习,由于有些操作符会涉及二进制,先来铺垫一下二进制。
--2进制:
--10进制数值: 123 的每一位都是有权重的,数值从右向左依次是个位、十位、百位……,每位权重是10⁰、10¹、10²……如下图——

--类比过去,2进制: 1101 每一位权重就是:2⁰、2¹、2²……

--根据权重,就能很好理解了。

--当然对于简单的10进制数值,可以直接选择权重相加,选上的为1,反之0,大家可以试一试!
--8进制数字由0~7组成,0~7数值转2进制,最多3个2进制位就够了;最大值7转2进制:111。
--转换规则:从2进制序列最右端向左每三个2进制位换一个8进制位,剩余不够三个的直接换:
--如2进制01101011转8进制-0153(0开头数值被视为8进制)

--16进制数字由0~9、a~f(表示10进制10~15)组成,各自写成2进制,最多有4个二进制位就够了,比如f的2进制-1111;
--转换规则:从2进制序列最右端向左每4个2进制位换一个16进制位,剩余不够四个直接换。
--如2进制:01101011,换成16进制:0x6b(表示16进制,前加0x)

--整数的2进制表示:原、反、补(32位)。
--有符号整数三种表示方法均由符号位、数值位,2进制序中,最高位的1位被视作符号位,其余数值位。
--无符号整数则都是数值位。
--符号位:"0"表示"正"、"1"表示"负"。
--正整数的原、反、补相同;负整数三种各不相同。
--原:直接将数值按正负数形式翻译成2进制;
--反:原码符号位不变,其余取反(0—>1\1—>0)即可;
--补:反码+1;(补码换原码:取反,+1);
--对于整型:数据存放在内存中放的是补码,为什么?
--使用补码,可以将符号位、数值位统一处理;同时加减法也统一处理(CPU只有加法器,将减法变成加负数计算)。
--最后打印输出转化为原码
--操作数只能是整数
--规则:左边抛弃,右边补0;
#include <stdio.h>
int main()
{
int num1 = 10;
//左移一位
int num2 = num1 << 1;
printf("%d\n", num1);
printf("%d\n", num2);
return 0;
}
//00000000000000000000000000001010——>num1补码——>10
//00000000000000000000000000010100——>num2补码——>20
--规则:
--(逻辑右移/算术右移取决于编译器,VS2022中是算术右移。)
int main()
{
int num1 = 10;
//右移一位
int num2 = num1 >> 1;
printf("%d\n", num1);
printf("%d\n", num2);
return 0;
}
//00000000000000000000000000001010——>num1补码——>10
//00000000000000000000000000000101——>num2补码——>5--num = -1


--注意:移位操作符,不能移动负数,未定义!
--位操作符有:
--操作数必须是整数
--运行代码,直观了解一下:
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);——>5
//10000000000000000000000000000011——num1原
//11111111111111111111111111111100——num1反
//11111111111111111111111111111101——num1补
//
//00000000000000000000000000000101——num1&num2补——>5
//
//num2补:00000000000000000000000000000101
printf("%d\n", num1 | num2);——>-3
printf("%d\n", num1 ^ num2);——>-8
printf("%d\n", ~0);——>-1
return 0;
}int main()
{
int num1 = 0;
int num2 = 0;
printf("请输入进行交换的数值:");
scanf("%d%d", &num1, &num2);
printf("num1 = %d num2 = %d\n", num1, num2);
num1 = num1 ^ num2;
//num1'=num1^num2
num2 = num1 ^ num2;
//num2'=num1'^num2=num1^num2^num2=num1
num1 = num1 ^ num2;
//num1=num1^num2^num1
//a^a=0;a^0=a;
//支持交换律
printf("num1 = %d num2 = %d\n", num1, num2);
return 0;
}补充: --a^a=0;a^0=a; --支持交换律;
int count_bits1_of_n(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
//循环进行一次就去掉一个1变成0,直到全为0,结束
count++;
}
}
int main()
{
int num = 0;
printf("请输入:");
scanf("%d", &num);
int ret = count_bits1_of_n(num);
printf("1的个数时:%d", ret);
return 0;
}--这串代码的构思比较难以想到,恰好运用了刚学的知识;一定要勤学、多练!
int main()
{
int a = 13;
a = a | (1 << 4);
printf("a=%d\n", a);
a &= ~(1 << 4);
printf("a=%d\n", a);
return 0;
}--形式:
exp1, exp2, exp3, …expN--逗号表达式:用","将多个表达式隔开,从左向右依次执行,有实际意义的表达式进行计算,但只有最后表达式的结果位整个表达式的结果。
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, b = a + 1);
//a=b+10有意义计算出a值,最后的表达式起作用,并延用a值
printf("%d\n",c);
return 0;
}--这个操作符在前面数组部分涉及到;比如arr[ 9 ] = 10,操作符的操作数就是arr、9.
--这个没啥可说的,直接看代码理解:
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("hehe\n");
int r = Add(3, 5);
printf("%d\n",r);
return 0;
}--操作数:函数名、参数都是操作数。
结语:本篇文章分享了关于操作符的一些知识,其中有旧知识也有新知识,一定要好好理解;下篇文章将会接着把操作符剩余部分知识进行分享。如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅给个三连吧~~~