基礎拾遺:除了&和&&的區別,你還要知道位運算的這5個運算子
文章目錄
前文傳送門,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?
讀者黑人問號:我工作三年,你就告訴這點東西,這不是浪費我點選來閱讀的流量費?
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
如圖:15的二進位制是(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
0000 0000 0000 1111
0000 0000 0001 0100
15|20結果
0000 0000 0001 1111
3.3 位邏輯異或運算: ^
^ 位邏輯異或運算 是將兩個運算物件按位進行異或運算,規則是:
1異或1等於0
1異或0等於1
0異或0等於0
即:相同得0,相異得1。15^20= 27(0001 1011)
0000 1111(15)
0001 0100(20)
15^20運算後的結果
0001 1011(27)
3.4 位邏輯左移運算<<
<< 位邏輯左移運算是將按位向左邊移動若干位,左移後空出的部分為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 位邏輯右移運算 >>
位邏輯右移運算是將按位向右邊移動若干位,右移後空出的部分為0 比如 0000 1111(15)左移3位(15<<3)就是0000 0001(1)
0000 1111(15)
左移3位結果是:
0000 0001(3)
右移相當於整除,右移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 版權協議,轉載請附上原文出處連結及本宣告。
相關文章
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- Java基礎09:邏輯運算子、位運算子Java
- java短路運算子和邏輯運算子的區別Java
- ## 運算子和方法的區別
- 位運算子的計算
- 運算子的基礎
- JAVA基礎--資料型別和運算子Java資料型別
- Java 基礎 之 算數運算子Java
- javascript基礎(算數運算子)(八)JavaScript
- 剩餘運算子與展開運算子的區別
- C++中運算子 &和&&、|和|| 的區別C++
- (位運算)兩個字串的位運算字串
- 【重溫基礎】5.表示式和運算子
- 計算機基礎:位運算計算機
- 05-JavaScript基礎-算數運算子JavaScript
- PHP基礎教程-10 算術運算子PHP
- 算術運算子裡的特殊運算子
- 運算子與= 區別
- Java 基礎-運算子Java
- == 運算子 - Java基礎Java
- 逍遙自在學C語言 | 位運算子的基礎用法C語言
- 8.Golang中的運算子-算術運算子、關係運算子、邏輯運算子、賦值運算子Golang賦值
- JAVA基礎提高之位運算Java
- java零基礎自學第一天②,運算子:表示式,算術運算子,+操作,賦值運算子,自增自減運算子,關係運算子,邏輯運算子,三元運算子Java賦值
- javascript基礎(賦值運算子,關係運算子,相等運算子,三元運算子,運算子的優先順序,程式碼塊)(十)JavaScript賦值
- PHP7 ?? 與 ?: 的作用和區別(null合併運算子, null條件運算子)PHPNull
- 位運算子
- [java基礎]之 運算子Java
- java基礎一:基本型別,運算子號Java型別
- javascript中&&運算子和||運算子的使用JavaScript
- Python學習-算術運算子,賦值運算子和複合運算子Python賦值
- c++ 和 c 三目運算子區別C++
- .NET基礎拾遺(1):型別語法基礎和記憶體管理基礎型別記憶體
- swift 區間運算子(... 和 ..Swift
- 遞增、遞減運算子位於變數前後的區別變數
- Python的運算物件、運算子、表示式和語句Python物件
- golang基礎–常量與運算子Golang
- Java基礎——邏輯運算子Java