操作符分类:
• 算术操作符: + 、- 、* 、/ 、%
• 移位操作符: << >>
• 位操作符: & | ^
• 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型)
• BB关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
结构成员访问: . 、->
16进制中数字:1 2 3 4 5 6 7 8 9 a b c d e f
10 11 12 13 14 15
一 .2进制转10进制:
2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是:2的0次方,2的1次方....2的31次方。
例如:1011=1*1+1*2+0*4+1*8=11
二 .10进制转化为2进制:
10进制数/2=最后一位余数~第一位余数组成的数排列一起为二进制数
例如 15/2=7...1;7/2=3...1;3/2=1...1;1/2=0...1
故15二进制数为1111
三 .2进制换为8进制:
每三位换为一位,不够添零;
例如 二进制11 001 111 =八进制 3 1 7
四 .二进制转为16进制
每4位换位一位,不够添0
例如:二进制1011 0101 0111=16进制 b 5 7
五. 原码、反码、补码:
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
符号位都是⽤0表⽰“正”,⽤1表⽰“负。
补码得到原码也是可以使⽤:取反,+1的操作。
对于整形来说:数据存放内存中其实存放的是补码。
六. 移位操作符(<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。)
1.左移操作符 :左边抛弃、右边补0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 0;//令n=10 原=反=补=00000000000000000000000000001010
scanf("%d", &n);// 00000000000000000000000000010100=20
n = n << 1;
printf("%d", n);
return 0;
}//<<1位有*2效果
2.右移操作符
1. 逻辑右移:左边⽤0填充,右边丢弃
算术右移:左边⽤原该值的符号位填充,右边丢弃
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 0;//令n=10 原=反=补=00000000000000000000000000001010
scanf("%d", &n);// 00000000000000000000000000000101=5
n = n >> 1;
printf("%d", n);
return 0;
}//>>1位有/2效果
七. 位操作符:&、|、^、~
& 有0全为0
| 有1全为1
^ 相同为0,相异为一
~ 全取反
1.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 5; //补码00000000000000000000000000000101
int b = -7;//10000000000000000000000000000111 补码11111111111111111111111111111001
printf("%d\n", a & b);// 补码00000000000000000000000000000001=1 &
printf("%d\n", a | b); // 11111111111111111111111111111101 原码
=100000000000000000000000000000000011=-3 |
printf("%d\n", a ^ b);// 11111111111111111111111111111100
100000000000000000000000000000000100=4 ^
printf("%d\n", ~a); // 11111111111111111111111111111010
100000000000000000000000000000000110=-6 ~
return 0;
}
不能创建临时变量(第三个变量),实现两个整数的交换。
#define _CRT_SECURE_NO_WARNINGS
//a^a=0 b=a^b^b a=a^a^b
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
求⼀个整数存储在内存中的⼆进制中1的个数。
1.#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Add(int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n = n / 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int c = Add(n);
printf("%d", c);
return 0;
}
2.#include <stdio.h>
int Add(int n)
{
int count = 0;
int i = 0;
while (n)
{
for (i = 0; i < 32; i++)
{
if((n>>i)&1==1)
count++;
}
return count;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int c = Add(n);
printf("%d", c);
return 0;
}
3.#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Add(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int c = Add(n);
printf("%d", c);
return 0;
}
编写代码将13⼆进制序列的第5位修改为1,然后再改回0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 10;
int n = 0; //0000000000000000000000000001010 & 11111111111111111111111111101111
scanf("%d", &n);
a = a | (1 << (n - 1));//a=(~(1<<(n-1)))&a
printf("%d\n", a);
a = (~(1 << (n - 1))) & a;
printf("%d\n", a);
return 0;
}
八 ( 单⽬操作符)
!、++、--、&、*、+、-、~ 、sizeof、(类型)
九(逗号表达式)
exp1, exp2, exp3, …expN
逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果
十.下标访问[]、函数调⽤()
1.[ ] 下标引⽤操作符
操作数:⼀个数组名 + ⼀个索引值(下标)
2.2 函数调⽤操作符
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。