c语言之运算符
1,算术操作运算符:+,-,*,/,%
2,逻辑运算:&&,||,!,>,>=,<,<=
3,位运算:<<(左移),>>(右移),&,|,^,~
【符号位为1表示负数,符号位为0表示正数】
左移和右移是对二进制数的操作
1) <<(左移):左移一位相当于乘以2
十进制数 左移n位 相当于*2的n次方
m m<<1 m*2^1
m m<<n m*2^n
例如: (带符号为) 十进制 二进制
4 00100
左移一位后: 8 01000
再例如:8bit的计算机 十进制的-1乘以2后的为-2
-1*2 = -2
即符号位不变,二进制的-1向左移动一位,最低位补0
以8位二进制表示为
十进制: -1 -2
符号位 符号位
原码: 1 0000001 1 0000010
补码: 1 1111111 1 1111110 (补码运算:除符号位外其他位取反,最低位再加1)
【注】左移最低为默认补0,最高位符号位不变。
2)>>(右移):右移一位相当于除以2
【提示】1,有符号时(最高位代表符号位;移动的时候符号位不变:1)当符号位为1时,向右移动一位,高位补1。2)当符号位为0时,向右移动一位,高位补0。) 2,无符号时右移动,高位都是补0。
例如:无符号整型a右移动n位 有符号整型a右移动n位
unsigned int a >>n int a>>n
等价于:a/2^n
例子1:
int main()
{
//有符号正整型a
int a = 5;//二进制表示位0101
int count_num = 0;
while(a){//右移动3位后跳出循环
a = a>>1;
}
printf("count_num = %d \n",count_num);//输出移动的次数
return 0;
}
执行结果如下图:
例子2:有符号负整型
int main()
{
//有符号负整型a
int a = -5;//负数二进制补码表示位11111111111111111111111111111011,右移动32位变后为11111111111111111111111111111111,进入死循环
int count_num = 0;
while(a){//右移动32位后跳出不出循环
a = a>>1;
++count_num;
}
printf("count_num = %d \n",count_num);//输出移动的次数
return 0;
}
执行结果如下图:
例子3:无符号正整型
int main()
{
//无符号正整型a
unsigned int a = 5;//二进制表示位101
int count_num = 0;
while(a){//右移动3位后跳出循环
a = a>>1;
}
printf("count_num = %d \n",count_num);//输出移动的次数
}
执行结果如下图:
例子4:无符号负整型
int main()
{
//无符号负整型a
unsigned int a = -5;//二进制表示位1111 1111 1111 1111 1111 1111 1111 1011
int count_num = 0;
while(a){//右移动32位后跳出循环
a = a>>1;
}
printf("count_num = %d , a=%d \n",count_num,a);//输出移动的次数
}
执行结果如下图:
经过以上四个例子验证了提示。
[十进制转二进制函数itoa(十进制,字符数组,
3) &(与门)
B&0--->0
&功能:屏蔽
例如:int a = 0x1425
a=a & 0xff00 ;
printf("a=%x",a);
a=0x1200 //屏蔽低8bit,取出高8bit
A & 1--->A
&:取出
&:(称)清零器 clr
4) |(或门)
A|0==A
保留
A\1==1
设置高电平的方法,设置Set
例子:
1>设置一个资源a的bit5为高电平,其他位不变
int a;
a =(a|(0x1<<5)); =======>a|(0x1<<n)
2>清除第五位,将其设置为0
int a;
a = a & ~(0x1<<5); ======>a = a&(~(0x1<<n));
5)^(异或):
1^1 = 0;
1^0 = 1;
0^0 = 0;
算法 AES SHA1
--------------
int main()
{
int a =20;
int b =30;
//实现a和b的值交换
//用c语句
int c;
c=a; 等价于 a = a^b;
a=b; ============>b = a^b;
b=c; a = a^b;
//结果 a = 30,b = 20
printf("a = %d , b = %d\n",a,b);
return 0;
}
6)~(取反):a=0xfffffff0 ~a==0x0000000f
4,赋值运算:=,+=,-=,&=,...
5,内存访问符号:(),{},[],->,.,&,*