位運算計算方式與例項

2021-10-23 00:24:00 字數 3169 閱讀 3877

1.非 ~

是乙個單目運算子,只有乙個運算物件。0變成1,1變成0。例如:二進位制1000 1101 進行位邏輯非運算為:0111 0010,對應十進位制~141等於-142。

正數取反(對應的負數-1),負數取反(對應的正數-1)。例如:~14 =-15    ~(-14)=13

2.與&

將兩個物件按位與運算,1與1等於1,1與0等於0, 0與0等於0

比如二進位制:1000 1101 & 0110 1100 等於00001100 對應十進位制:141&108 =12

3.或 |

將兩個物件按位或運算,1或0等於1,1或1等於1,0或0等於0

例如二進位制: 1000 1101 | 0110 1100 等於11101101 對應十進位制:141|108=237

4.異或^

將兩個物件異或運算,規則: 相同得0,不同得1

例如二進位制: 1000 1101 ^ 0110 1100 等於1110 0001 對應十進位制:141^108=225

5.左移<<

將整個數 按位左移 若干位,空位補0

例如:1000 1101<<3 等於0100 0110 1000 對應十進位制 :141<<3 =1128

這裡要說明一下:當溢位位不為0時,此時要考慮32位。

再如:0011 0110<<2 ,此時溢位位為0,所以就等於 1101 1000 ,對應十進位制:54<<2=216

54<<3 = 0001 1011 0000 對應十進位制:432

負數的左移運算,可以先求對應正數,加上-

6.右移》

位右移運算將整個數按位右移若干位,右移後空出的部分填0

例如:1000 1101>>3 等於0001 0001 對應十進位制 :141>>3 =17

負數右移:先求對應正數右移,取負減1: -141>>3= -18

二進位制:0和1組成,二進位制數運算規律是逢二進一

十進位制:0-10組成 ,滿十進一,滿二十進二,

十進位制轉換二進位制怎麼快速計算?

不斷除以2,將所得餘數逆向就是所得的二進位制數

例如:以計算8的二進位制為例:

8/2=4 餘0

4/2=2 餘0

2/2=1 餘0

1/2=0 餘1

那麼8的二進位制數就是1000,同理,16的就是10000.47的就是101111

二進位制數如何轉換成十進位制數?

就是是第幾位就乘以2的幾次方 從右往左數,得到的結果相加就是答案

例如:01101011.轉十進位制:

1乘2的0次方=1

1乘2的1次方=2

0乘2的2次方=0

1乘2的3次方=8

0乘2的4次方=0

1乘2的5次方=32

1乘2的6次方=64

0乘2的7次方=0

然後:1+2+0+8+0+32+64+0=107.

二進位制01101011=十進位制107

快速:1是0000 0001,2是0000 0010, 4是0000 0100 以此類推 8 16 32...

概念:

[原碼]:計算機中將乙個數字轉換為二進位制,並在其最高位加上符號的一種表示方法。(規定)

[反碼]:根據表示規定,正數的反碼就是本身,而負數的反碼,除符號位外,其餘位依次取反。

[補碼]:根據表示規定,正數的補碼就是本身,而負數的補碼,是在其反碼的末位加1。(為了溢位)

規則:

(第一位是不是符號位看是不是unsigned,不是unsigned約定第一位是符號位)

不帶符號:

左移補0 ,右移不足看符號位補。

帶符號運算:

負數,原碼→反碼(取反),算補碼(+1),計算,然後反碼→補碼,得到結果。

例子:

計算正數: 

例如: 1 << 0 就是把1(00000001)左移0位,所以不變還是1 ,

例如: 1 << 1 就是把1(00000001)左移1位,結果是2(00000010),

計算負數:

例如:-7 >> 2;     -7→原碼1000 0111→反碼1111 1000→ 補碼1111 1001→右移2→1111 1110→ 反碼1111 1101→ 補碼1000 0010 就是-2

例如:-5 >> 1;    -5→原碼1000 0101→反碼1111 1010→ 補碼1111 1011→右移1→1111 1101→ 反碼1000 0010→ 補碼1000 0011 就是-3

例如:-10 >> 2;-10→原碼1000 1010→反碼1111 0101→ 補碼1111 0110→右移2→1111 1101→ 反碼1000 0010→ 補碼1000 0011 就是-3

例如:-2 & -3;       

//原碼 10000010 10000011

//取反 11111101 11111100 (反碼)

//加一 11111110 11111101 (補碼)

//與運算 11111100

//取反:10000011

//再加1:10000100 是-4

位元組轉換

1位元組是8位(bit) 

美國出了乙個編碼標準,名字叫ascii編碼(全稱american standard code for information interchange 美國資訊交換標準碼),它把所有字元包括單詞,標點符號全部都囊括進來了,總共是128(0~127)個字元,這足夠美國人用了,而2^7=128,即7個0和1的組合,同時為了保險,萬一不夠用呢,就將8個0和1的組合儲存在乙個位元組中,這就是1個位元組(1b)用8個二進位制位(8b)表示的由來

---使用例項---

---@type int

local banflag = 0

---@class activetype

activetype =

---@param isactive boolean

---@param type

function setslotactive(isactive, type)

if isactive then

local mask = ~ type

banflag = banflag & mask

else

banflag = banflag | type

endend

C 位運算及例項計算

前言 平時在實際工作中很少用到這個,雖然都是一些比較基礎的東西,但一旦遇到了,又不知所云。剛好最近接觸了一些相關這方面的專案,所以也算是對 這些內容重新溫習實踐了一遍。所以這篇不僅作為個人備忘,也分享給各位重溫一遍。要學會位運算,首先要清楚什麼是位運算?程式中的所有內容在計算機記憶體中都是以二進位制...

位運算例項與棧

符合字典序且不破壞相對位置用棧 排序演算法穩定性 看相對位置是否能改變。如果當前元素比乙個元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中2個5的相對前後順序就被破...

位運算例項

位運算子 與 或 異或 非 左移運算子 右移運算子 1 例項一 給定字母字串a和字串b,判斷a是否包含所有字母b。這題有很多解法,讓我們回憶一下,最常用的陣列如何解呢。我們維護乙個26長度的陣列,a.z對應陣列的下表是1.26,每個index對應的取0或1,如果存在即為1,如果不存在即為0。遍歷字元...