C/C++之位运算符与逻辑运算符详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Bruce_0712/article/details/63679726

一、位运算符用法

    C语言中的位运算符主要有以下几种:

   

    使用的时候主要有以下几个注意点:

    1.左移运算符将<<将运算数的二进位左移,高位丢弃,低位补零。

    2.右移运算符将>>将运算数的二进位右移,低位丢弃,高位补零。

    3.避免位运算符,逻辑运算符和数学运算符出现在同一个表达式中,如果要在同一个表达式中出现,那么需要用括号来表达运算次序。

    4.左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方,但是他们的运算效率要比数学运算符高。


不用第三个中间变量实现两个数的交换

    方法1:

    a=a+b;

    b=a-b;

    a=a-b;

    方法2:

    a=a^b;

    b=a^b;

    a=a^b;


    面试题解析

    有一个数列,其中的自然数都是以偶数的形式出现,只有一个自然数出现的次数为奇数次。编写程序找出这个自然数。

    最简单的方法使用异或方法,如下:

[objc]  view plain  copy
  1. <span style="font-size:18px;">#include <stdio.h>  
  2.    
  3. #define SIZE(a) sizeof(a)/sizeof(*a)  
  4.    
  5. int a[]={1,2,3,4,5,2,3,4,5,1,1,1,1,1,2};  
  6.    
  7. int main(void)  
  8. {  
  9.     intresult=0;  
  10.     inti=0;  
  11.      
  12.     for(i=0;i<SIZE(a);i++)  
  13.     {  
  14.        result=result^a[i];   
  15.     }  
  16.      
  17.     printf("result=%d\n",result);  
  18.      
  19.     return0;  
  20. }</span>  

    这主要运用了两个规则:第一,自己和自己异或等于0;第二:异或具有交换律的特性。

 

    1<<32位的结果是什么?1<<-1的结果是什么?

[objc]  view plain  copy
  1. <span style="font-size:18px;">#include <stdio.h>  
  2.    
  3. int main(void)  
  4. {  
  5.      
  6.     printf("%d\n",1<<32);  
  7.     printf("%d\n",1<<-1);  
  8.      
  9.     return0;  
  10. }</span>  

编译出现如下错误:

    其实这个是可以理解的,因为我们数据int时32位的,这样就越界了,负数这里不允许移位,在我看来也没有什么具体的意义,如有知道的大侠可以告知。

二、位运算符用法

C语言中提供了三种逻辑运算符:

  1. &&(与运算)
  2. ||(或运算)
  3. !(非运算)

与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:


“&&”和“||”低于关系运算符,“!”高于算术运算符。
 
按照运算符的优先顺序可以得出:
  • a>b && c>d  等价于  (a>b)&&(c>d)
  • !b==c||d<a  等价于  ((!b)==c)||(d<a)
  • a+b>c&&x+y<b  等价于  ((a+b)>c)&&((x+y)<b)

逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:

1) 与运算(&&)
参与运算的两个量都为真时,结果才为真,否则为假。例如:
    5>0 && 4>2
由于5>0为真,4>2也为真,相与的结果也为真。

2) 或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
    5>0||5>8
由于5>0为真,相或的结果也就为真。

3) 非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
    !(5>0)
的结果为假。

虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:
        由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:
        5||0的值为“真”,即为1。

猜你喜欢

转载自blog.csdn.net/Bruce_0712/article/details/63679726