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。遍歷字元...