邏輯運算符有:
&& 稱為邏輯與運算符。如果兩個操作數都非零,則條件為真。
|| 稱為邏輯或運算符。如果兩個操作數中有任意一個非零,則條件為真
! 稱為邏輯非運算符。用來逆轉操作數的邏輯狀态。如果條件為真則邏輯非運算符将使其為假
如:
#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 按上表的按位與規則
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;//
0000 0000 0000 0000 0000 0000 0001 1000->0001 1000=22
左移是把左邊的移出去,不夠位的再右補0。同理右移把右邊的移出去,不夠位的再左補0。
大家還有什麼地方不好理解的,歡迎留言,我們一起讨論。關注我,下次針對留言分享幹貨。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!