位運算 看這篇就夠了

前言
不知道大家是不是像我之前一樣一看到二進制丶十六進制就頭大,更別說位運算了,也不知道位運算的作用是啥,索性花了一些時間整理出這些知識點。
我們知道程序中的所有數(shù)在計算機內(nèi)存中都是以二進制的形式儲存的。位運算就是直接對整數(shù)在內(nèi)存中的二進制位進行操作。
在系統(tǒng)軟件中,常常需要處理二進制位的問題。C語言提供了6個位操作運算符。這些運算符只能用于整型操作數(shù),即只能用于帶符號或無符號的char,short,int與long類型。
而二進制有8位(最低)丶 16位 丶32位 丶64位甚至更多,我們要怎樣進行 這令人愉悅的折磨呢 位運算呢?
X進制與二進制
既然位運算操作的是二進制數(shù),就需要先把其他數(shù)轉(zhuǎn)換成二進制. 如果你已經(jīng)知道如何進制轉(zhuǎn)換可以跳到位運算這段。
首先看下十進制轉(zhuǎn)二進制
125轉(zhuǎn)換成二進制是01111101,計算方法很簡單正十進制數(shù)除以二,得到的商再除以二,依次類推直到商為零時為止,然后在旁邊標(biāo)出各步的余數(shù),最后倒著寫出來,再根據(jù)實際高位補零,即除二取余,倒序排列,高位補零。
/* 以下是計算過程 商/2 --------- 余數(shù) */ 125/2 --------- 1 62/2 --------- 0 31/2 --------- 1 15/2 --------- 1 7/2 --------- 1 3/2 --------- 1 1/2 --------- 1 0
將余數(shù)倒置則是1111101,然后我們發(fā)現(xiàn)結(jié)果只有7位數(shù),而二進制最低位是8位,所以進行高位補零之后得到他的最終結(jié)果01111101
前置知識:被除數(shù)÷除數(shù)=商··· ···余數(shù) 例: 10 ÷ 3 =3... ... 1
二進制轉(zhuǎn)X進制
知道了十進制轉(zhuǎn)二進制,那你知道反過來該怎么算嗎?
將二進制中的位數(shù)分別與對應(yīng)的值相乘,然后相加得到的就為十進制
我們看到01111101這個二進制,它是一個八位數(shù),從低位(最右邊)開始計算,分別乘對應(yīng)的值,最后相加,那如何區(qū)分一個二進制是正數(shù)還是負(fù)數(shù)呢?當(dāng)然是看首位,首位為1為負(fù)數(shù),首位為0為正數(shù),這里的首位指的是二進制的頭一個數(shù),而不是位數(shù)的最低位(計算是從低位開始,判斷正負(fù)則看首位)。
二進制: 0 1 1 1 1 1 0 1 第幾位: 7 6 5 4 3 2 1 0? ? ? ? =(1*2^0)+(0*2^1)+(1*2^2)+(1*2^3)+(1*2^4)+(1*2^5)+(1*2^6)+(0*2^7) ? ? ? = 1+0+4+8+16+32+64+0 ? ? ? = 125
這樣就得出了結(jié)果125,然后首位為0則是正125。
其他進制轉(zhuǎn)二進制
8進制丶16進制 2進制等相互轉(zhuǎn)換其實是很簡單的,因為其有對應(yīng)關(guān)系
8 = 2^3 (8→2)取一分三 (2→8)取三合一 16 = 2^4 (16→2)取一分四 (2→16)取四合一 32 = 2^5 (32→2)取一分五 (2→32)取五合一 ... //即二進制分組 二進制 01111101 分組(取四合一) 0111 1101 計算對應(yīng)數(shù) 7 D
負(fù)數(shù)轉(zhuǎn)二進制
上面說的是正整數(shù)轉(zhuǎn)二進制的方法,那么負(fù)數(shù)呢?
如果你已經(jīng)知道了一個正十進制數(shù)的二進制結(jié)果,那么他的負(fù)十進制數(shù)的二進制結(jié)果則是:
二進制取反,然后對結(jié)果再加一
如何理解呢,我們已經(jīng)算出125的二進制(8位情況下)表示是01111101,取反的意思則是0變成1,1變成0,結(jié)果是10000010,然后加一,而二進制逢二進一,所以得出得結(jié)果為10000011,所以-125的二進制在8位的顯示中為10000011。
為什么要說在八位的顯示中?
如果是在16位 32位有何不同?
你可能會發(fā)現(xiàn)一個問題,如果用10000011反過來計算十進制的話,會發(fā)現(xiàn)他是131 而不是-125,為什么會這樣呢?
那是因為有符號和無符號的表示方式不同,在java中byte,short,int,long都是有符號的,他們也有對應(yīng)的位數(shù)和范圍(以下^代表冪):
符號 | 占位 | 字節(jié) | 范圍 |
---|---|---|---|
byte | 8 | 1 | -2^7 ~ 2^7-1(-128 ~ 127) |
short | 16 | 2 | -2^15 ~ 2^15-1 |
int | 32 | 4 | -2^31 ~ 2^31-1 |
long | 64 | 8 | -2^63 ~ 2^63-1 |
當(dāng)定義八位(byte)-125時它代表的八位二進制是10000011,當(dāng)你反過來算時得到的值131>八位(byte)的范圍,所以他并不能用byte表示。
byte a = 131; //錯誤 范圍超出
所以當(dāng)10000011用來表示八位二進制是-125
正確算法應(yīng)該是把正數(shù)轉(zhuǎn)負(fù)數(shù)的步驟逆向運算,正數(shù)轉(zhuǎn)負(fù)數(shù)時我們是取反再加一,反過來當(dāng)范圍超需要表示為負(fù)數(shù)時減一取反才得出的結(jié)果才是正確的值,然后再根據(jù)首位為1是負(fù)數(shù)(轉(zhuǎn)換之前的首位),為0是正數(shù)確定符號。
(byte) 1000 0011 = -125 (short)0000 0000 1000 0011 = 131 (short)1111 1111 1000 0011 = -125
以上就是關(guān)于各進制與二進制之間的轉(zhuǎn)換了。
位運算
接下來我們看一下如何進行位運算,位運算到底有什么用呢?
- 大部分時候我們不會用到位運算,特別是碼農(nóng)時代,明了直接才更有用。但是位運算就沒有用處了么?不是,位運算的作用大多體現(xiàn)在研究類運用。位運算生澀難懂,不過有個很明顯的優(yōu)勢就是特別快。因為這是計算機看的語言,也是內(nèi)部運算的語言."
- *如果在平時編程當(dāng)中如果正常的運算能更讓人理解的話是沒必要使用位運算表示的,強行使用無異于炫技罷了,代碼是讓人看的。
位取反(~)
位取反即之前負(fù)數(shù)轉(zhuǎn)二進制所用的方式,即0變1,1變0。
10001100 01110011
位與(&)
位與即如果兩個位進行比較兩位同時為1,結(jié)果才為1,否則結(jié)果為0。
例如: 125 & 7
125 & 7 二進制: 01111101 & 00000111 位與比較: 0 1 1 1 1 1 0 1 --------------- 0 0 0 0 0 1 1 1 | | | | | | | | × × × × × √ × √ | | | | | | | | 0 0 0 0 0 1 0 1 結(jié)果: 125&7 = 0000 0111 = 5
位或(|)
位或即如果兩個位進行比較兩位同時為0,結(jié)果才為0,否則結(jié)果為1。
例如: 125 | 7
125 | 7 二進制: 01111101 | 00000111 位或比較: 0 1 1 1 1 1 0 1 --------------- 0 0 0 0 0 1 1 1 | | | | | | | | √ × × × × × × × | | | | | | | | 0 1 1 1 1 1 1 1 結(jié)果: 125|7 = 0111 1111 = 7
異或(^)
位異或即如果兩個位進行比較相同取0,不同取1。
例如: 125 ^ 7(java中^代表異或)
125 ^ 7 二進制: 01111101 ^ 00000111 位異或比較: 0 1 1 1 1 1 0 1 --------------- 0 0 0 0 0 1 1 1 | | | | | | | | √ × × × × √ × √ | | | | | | | | 0 1 1 1 1 0 1 0 結(jié)果: 125^7 = 0111 1010 = 122
異或的幾條性質(zhì):
1、交換律
2、結(jié)合律 (a^b)^c == a^(b^c)
3、對于任何數(shù)x,都有 x^x=0,x^0=x
4、自反性: a^b^b=a^0=a;
編程算法中的作用:交換兩個數(shù)(利用性質(zhì))
public void Swap(int &a, int &b){ if (a != b){ a ^= b; //a=a^b b ^= a; //b=b^(a^b) = (b^b)^a = a a ^= b; //a=(a^b)^a = (a^a)^b = b } }
右移(>>)
將一個數(shù)的各二進制位全部右移若干位,正數(shù)左補0,負(fù)數(shù)左補1,右邊丟棄。
125>>3
125 >> 3 右移: 0 1 1 1 1 1 0 1 --------------- 0 0 1 1 1 1 1 0 |1 >> 1 0 0 0 1 1 1 1 1 |0 1 >> 2 0 0 0 0 1 1 1 1 |1 0 1 >> 3 ^ ^ ^ 正數(shù)補0負(fù)數(shù)補1 結(jié)果: 125>>3 = 0000 1111 = 15 等價與 125/2的3次方的商
左移(<<)
同樣的,左移則是將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
125>>3
125 >> 3 右移: 0 1 1 1 1 1 0 1 --------------- 0|1 1 1 1 1 0 1 0 << 1 0 1|1 1 1 1 0 1 0 0 << 2 0 1 1|1 1 1 0 1 0 0 0 << 3 ^ ^ ^ 補0 結(jié)果: 125<<3 = 1110 1000 = -24(八位) 125<<3 = 1110 1000 = 1000(十六位) 相當(dāng):125*2的3次方(若左移時舍棄的高位不包含1)
無符號右移(>>>)
無符號右移則始終補0,不考慮正負(fù)數(shù)。
總結(jié):
符號 | 描述 | 運算規(guī)則 |
---|---|---|
~ | 反 | 1變0,0變1 |
& | 與 | 兩個位都為1時,結(jié)果才為1 |
| | 或 | 兩個位都為0時,結(jié)果才為0 |
^ | 異或 | 兩個位相同為0,相異為1 |
>> | 右移 | 各二進位全部左移若干位,高位丟棄,低位補0 |
<< | 左移 | 各二進位全部右移若干位,對無符號數(shù),高位補0,有符號數(shù),各編譯器處理方法不一樣,有的補符號位(算術(shù)右移),有的補0(邏輯右移) |
MENMORY TOAST >>>>>>
到此這篇關(guān)于位運算 看這篇就夠了的文章就介紹到這了,更多相關(guān)位運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
FTTC/FTTH和FTTR有什么區(qū)別? 光纖接入方式詳細(xì)介紹
國內(nèi)主流 ISP 普遍都采用了光纖連接,常見術(shù)語包括 FTTC(光纖到路邊)、FTTB(光纖到樓宇)、FTTH(光纖到戶)和 FTTR(光纖到房間),他們之間有什么區(qū)別?詳細(xì)如下2025-03-05TP-Link PDDNS服將于務(wù)6月30日正式停運:用戶需轉(zhuǎn)向第三方DDNS服務(wù)
近期,路由器制造巨頭普聯(lián)(TP-Link)在用戶群體中引發(fā)了一系列重要變動,上個月,公司發(fā)出了一則通知,明確要求所有用戶必須通過實名認(rèn)證流程,方能繼續(xù)使用其提供的DDNS服2025-02-15電腦怎么查看隱藏和顯示SSID? 服務(wù)集標(biāo)識符等你來揭秘
之前我們介紹過ssid的概念,那么自己的設(shè)備怎么顯示ssid和隱藏ssid呢?下面我們就來看看詳細(xì)的教程2025-01-14SSID究竟是什么? WiFi網(wǎng)絡(luò)名稱及工作方式解析
SID可以看作是無線網(wǎng)絡(luò)的名稱,類似于有線網(wǎng)絡(luò)中的網(wǎng)絡(luò)名稱或者路由器的名稱,在無線網(wǎng)絡(luò)中,設(shè)備通過SSID來識別和連接到特定的無線網(wǎng)絡(luò)2025-01-14向日葵Q2Pro怎么樣? 貝銳向日葵Q2Pro工業(yè)級遠(yuǎn)控設(shè)備測評
今天帶來的這款向日葵 Q2Pro ,就是一款專門用于工業(yè)設(shè)備、醫(yī)療設(shè)備等遠(yuǎn)程控制的硬件產(chǎn)品,憑借其即插即用、斷網(wǎng)可遠(yuǎn)控、無需被控主機安裝軟件等特性,為設(shè)備維護帶來了全2024-11-23雙頻BE5100面板AP! TP-LINK TL-7AP5100HI-PoE拆機測評
TP-LINK一款為TL-7AP5100HI-PoE 易展版的 Wi-Fi 7 AP 面板怎么樣?該面板隸屬 BE5100 規(guī)格家族,詳細(xì)請看下文拆機測評2024-06-28AP2.4g和5g的wifi區(qū)別 無線網(wǎng)2.4g和5g有什么區(qū)別
AP2.4g和5g的wifi區(qū)別 無線網(wǎng)2.4g和5g有什么區(qū)別WIFI這一名詞可謂是家喻戶曉,但是你知道2.4g和5g wifi的區(qū)別嗎2024-01-03- 無線路由器根據(jù)不同用戶群體的需求,提供了多種工作模式,只有選對了模式,才能充分發(fā)揮路由器的作用,路由器常見的三大工作模式為:路由模式、中繼模式和AP模式,不同的模2023-12-26
- 第一次測評PCIe 3.0 x1的雙口2.5G網(wǎng)卡,下面我們就來看看SSU雙口2.5G網(wǎng)卡拆機和測試雙口有沒有瓶頸2023-12-12
一篇文章告訴你公網(wǎng),私網(wǎng),內(nèi)網(wǎng),外網(wǎng)的區(qū)別
最近經(jīng)常有很多小白朋友在后臺問,公網(wǎng)、私網(wǎng)、內(nèi)網(wǎng)、外網(wǎng),這些的概念是啥樣的,又該怎么去界定2023-09-06