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,内存访问符号:(),{},[],->,.,&,*

发布了26 篇原创文章 · 获赞 11 · 访问量 596

猜你喜欢

转载自blog.csdn.net/weixin_38251305/article/details/103882696