基礎拾遺:除了&和&&的區別,你還要知道位運算的這5個運算子

dotnet全棧開發發表於2020-01-11


前文傳送門,dotNET開發基礎彙總系列
StackOverflow 20萬閱讀的問題:如何實現非同步Task超時的處理
Func和Action委託簡單用法
C#非同步程式設計基礎入門總結
C#泛型入門學習泛型類、泛型集合、泛型方法、泛型約束、泛型委託
C#異常處理總結
Try-Catch無法正確定位異常位置,我推薦2個有效技巧

01 前言

那年剛找工作那會,就碰到過這麼一個簡單的題目1.都是作為邏輯與的運算子。2.&&具有短路功能,計算出前者false,就不需計算後者的true or false。後來在微信群裡看到有人問類似的問題,引發了我的思考。

02 &和&&的區別

相同點
&和&&都可作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,其結果才為true,否則,只要有一方為false,則結果為false。(ps:當要用到邏輯與的時候&是毫無意義,&本身就不是幹這個的)
不同點

if(loginUser!=null&&string.IsnullOrEmpty(loginUser.UserName))
  • &&具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式,對於上面的表示式,當loginUser為null時,後面的表示式不會執行,所以不會出現NullPointerException如果將&&改為&,則會丟擲NullPointerException異常。(ps:所以說當要用到邏輯與的時候&是毫無意義的)
  • & 是用作位運算的。

總結

  • &是位運算,返回結果是int型別

  • &&是邏輯運算,返回結果是bool型別 what are doing?

讀者黑人問號:我工作三年,你就告訴這點東西,這不是浪費我點選來閱讀的流量費?

640?wx_fmt=jpeg

03 位運算的使用

直接進入主題位運算,這篇文章本身沒有任何難度,工作中甚至用不到位運算,埋個伏筆:
在掌握位運算之前,應該明確位運算的兩個概念。

  • Q1:什麼樣的資料型別可以進行位運算?位運算的物件是int 、char 型別。幼兒園式說法就是對二進位制的1101(13)進行運算

  • Q2:雲運算的結果是什麼?結果是整型
    常見的5個位運算子

符號 意義 運算物件型別 運算結果型別 示例
~ 邏輯非運算 整型、char 整型 ~a
& 邏輯與運算 a&b
| 邏輯或運算 a|b
<< 位左移運算 a<<2
>> 位右移運算 a>>2

3.1 位邏輯與運算:&

& 與運算是將兩個運算物件按位於進行與運算。規則是:

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

如圖:640?wx_fmt=png15的二進位制是(ps:16位int,32位int多打16個0浪費流量)

    0000 0000 0000 1111

20的二進位制是

    0000 0000 0001 0100

15&20的結果是4

0000 0000 0000 1111
0000 0000 0001 0100
15&20 結果:
 0000 0000 0000 0100

3.2 位邏輯或運算:|

| 位邏輯或運算是將兩個運算物件按位進行或運算,運算的規則是

    1|1=1
    1|0=1
    0|0=0
    兩位對比有一個1即為1

如15|20的結果計算結果就是31
640?wx_fmt=png

0000 0000 0000 1111
0000 0000 0001 0100
15|20結果
0000 0000 0001 1111

3.3 位邏輯異或運算: ^

640?wx_fmt=png^ 位邏輯異或運算 是將兩個運算物件按位進行異或運算,規則是:

1異或1等於0
1異或0等於1
0異或0等於0

即:相同得0,相異得1。15^20= 27(0001 1011)

 0000 1111150001 01002015^20運算後的結果
 0001 101127

3.4 位邏輯左移運算<<

640?wx_fmt=png<< 位邏輯左移運算是將按位向左邊移動若干位,左移後空出的部分為0。

比如15的二進位制0000 1111 左移8位就是1111 0000 0000

0000 0000 0000 1111
15>> 左移8位的結果:
0000 1111 0000 0000
15<<8=3840

左移3位(15<<3)就是0111 1000結果是120
a<<1 =2
a<<2 =4
a<<3 =8

結論 a左移n位就是相當於a乘2的n次方

3.5 位邏輯右移運算 >>

640?wx_fmt=png位邏輯右移運算是將按位向右邊移動若干位,右移後空出的部分為0 比如 0000 1111(15)左移3位(15<<3)就是0000 0001(1)

0000 111115)
左移3位結果是:
0000 00013

右移相當於整除,右移1位相當於除以2的1次方,右移2相當於除以2的2次方。(ps:這個除法是計算機的除法,你懂得)

04 位運算還能幹嘛

位運算的騷操作其實挺多的,篇幅不夠,所以留著下一篇寫。例如:

  • 如將一個月的簽到記錄儲存到1個int型別中

  • 判斷奇偶數

  • 許可權設定,增刪改查4個操作,合併成一個整型

  • 交換兩個數

  • 計算2的3次方最高效就是用位運算左移<<

  • 計算a的b次方

  • 一組整型資料,找出沒有重複的數

關於其他的一些基礎知識概念的總結:
位、位元組、字元(英文字母)、漢字、KB、MB、GB、TB的關係

  • 位:bit,也叫位元位,是計算機表示資料最小的單位,用二進位制0和1來儲存
  • 位元組:byte,1byte(1B)=8b,一個位元組=8位
  • 字元:char,1char=2byte=16b,1個字元=2個位元組=16位
  • KB,1KB=1024byte(1024B)
  • MB,1MB=1014KB
  • GB,1GB=1024MB
  • TB,1TB=1024GB
  • 一個漢字佔兩個位元組,也就是32位,一篇1000字的文章,大概就是32*1000 的二進位制0或1 。
  • 一個10M的短視訊,也就是10M=1024KB10=1024位元組1010=1024b10108
    大概就是919200個二進位制的0和1了
  • short 是16位,int是32位,long是64位KB,1KB=1024byte(1024B)
    short 、int 、long之間能組合、互轉嗎?
    其他的一些實際操作的連結,看往期,寫的比較亂,見諒!
    C#位運算使用場景之操作整型某一位
    C#位運算實際運用

作者資訊
【文章資訊】:作者-張林:原文連結-https://blog.csdn.net/kebi007/article/details/103175193
【原創公眾號】:dotNet全棧開發。好文目錄
版權宣告:本文為CSDN博主「dotNet全棧開發」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。

相關文章