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


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

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 版權協議,轉載請附上原文出處鏈接及本聲明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章