tft每日頭條

 > 生活

 > 邏輯運算符非邏輯運算符

邏輯運算符非邏輯運算符

生活 更新时间:2024-11-23 13:17:47
C語言運算符包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符和其他運算符。上一次我們講了算術運算符中的 ,-- ,%這些難以理解的或平時工作需要注意運算符。這一次我們講邏輯運算符與位運算符,剩下的運算符都很簡單不用,我就不多說了,為什麼要把這兩種運算符放一起講,因為很多在工作中的同學(在阿裡巴巴,華為這些大公司,都稱同事叫同學,這裡我們就可以稱呼)都經常搞混淆或者不會用,我在工作中就見過這樣的同學,面試也遇到過。下面我們步入正題。

邏輯運算符有:

&& 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。

|| 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真

! 稱為邏輯非運算符。用來逆轉操作數的邏輯狀态。如果條件為真則邏輯非運算符将使其為假

如:

#include <stdio.h>

int main(){

int a = 5;

int b = 20;

int c ;

if ( a && b )

printf("Line 1 - 條件為真\n" );

}

if ( a || b )

{

printf("Line 2 - 條件為真\n" );

}

/* 改變 a 和 b 的值 */

a = 0;

b = 10;

if ( a && b )

{

printf("Line 3 - 條件為真\n" );

}

else

{

printf("Line 3 - 條件為假\n" );

}

if ( !(a && b) )

{

printf("Line 4 - 條件為真\n" );

}

}

當上面的代碼被編譯和執行時,它會産生下列結果:

Line 1 - 條件為真

Line 2 - 條件為真

Line 3 - 條件為假

Line 4 - 條件為真

這些邏輯運算很理解。

我們着重講位運算符

位運算符

位運算符作用于位,位運算符有&、 | 、 ^、~、<<、>> 。

&按位與操作,按二進制位進行"與"運算。運算規則:

0&0=0;

0&1=0; 1&0=0; 1&1=1;

| 按位或運算符,按二進制位進行"或"運算。運算規則:

0|0=0; 0|1=1; 1|0=1; 1|1=1;

^ 異或運算符,按二進制位進行"異或"運算。運算規則:

0^0=0; 0^1=1; 1^0=1; 1^1=0;

~取反運算符,按二進制位進行"取反"運算。運算規則:

~1=-2; ~0=-1;

<< 二進制左移運算符。将一個運算對象的各二進制位全部左移若幹位(左邊的二進制位丢棄,右邊補0)。

>>二進制右移運算符。将一個數的各二進制位全部右移若幹位,正數左補0,負數左補1,右邊丢棄。

上面估計還有些同學看不懂。所謂位運算符就是針對位(二進制進行操作的),位是什麼概念,我們回顧一下,int 占4個字節,而一個字節占8位。數據在計算存儲都是以二進制存的,也就是0與1存的。

Eg:

int a=6;//0000 0110 在計算機存儲。本來是0000 0000....共有32位,隻是前面全是0,我們就寫成8位。

下面我們舉個例

實例

#include <stdio.h>

int main()

{

unsigned int a = 60;/* 60 = 0011 1100 */

unsigned int b = 13;/* 13 = 0000 1101 */

int c = 0;

c = a & b; /* 12 = 0000 1100 */

printf("Line 1 - c 的值是 %d\n", c );

c = a | b; /* 61 = 0011 1101 */

printf("Line 2 - c 的值是 %d\n", c );

c = a ^ b; /* 49 = 0011 0001 *

printf("Line 3 - c 的值是 %d\n", c );

c = ~a; /*-61 = 1100 0011 */

printf("Line 4 - c 的值是 %d\n", c );

c = a << 2; /* 240 = 1111 0000 */

printf("Line 5 - c 的值是 %d\n", c );

c = a >> 2; /* 15 = 0000 1111 */

printf("Line 6 - c 的值是 %d\n", c );

}

當上面的代碼被編譯和執行時,它會産生下列結果:

Line 1 - c 的值是 12

Line 2 - c 的值是 61

Line 3 - c 的值是 49

Line 4 - c 的值是 -61

Line 5 - c 的值是 240

Line 6 - c 的值是 15

我們上述程序講解一下。

unsigned int a = 60;/* 60 = 0011 1100 */

unsigned int b = 13;/* 13 = 0000 1101 */

a&b 按上表的按位與規則

邏輯運算符非邏輯運算符(邏輯運算符VS位運算符)1

a&b=0000 1100= 0*2^7 0*2^6 0*2^5 0*2^4 1*2^3 1*2^2 0*2^1 0*2^0

=0 0 0 0 8 4 0 0=12

同理“ | ” “^”也可以按規則計算,”^”運算符規則就記住 兩個值不相同,則異或結果為1。如果兩個值相同,異或結果為0。

取~符号 就是把二進制對應位取為相反就可以了,0變成1,1變成0。So easy !

左移<< 就是二進制整個往左移,不足補0。右移>> 就是二進制整個往右移,不足補0,

Eg:

Int a=6 ;//0000 0000 0000 0000 0000 0000 0000 0110 圖這裡我們隻管8位,再往左全是0(左邊是高位),就不會管了。

a<<2;//

邏輯運算符非邏輯運算符(邏輯運算符VS位運算符)2

0000 0000 0000 0000 0000 0000 0001 1000->0001 1000=22

左移是把左邊的移出去,不夠位的再右補0。同理右移把右邊的移出去,不夠位的再左補0。

大家還有什麼地方不好理解的,歡迎留言,我們一起讨論。關注我,下次針對留言分享幹貨。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved