1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
如果我沒理解錯(cuò)的話 ... 你要問的是如何手動(dòng)進(jìn)行位運(yùn)算對(duì)吧 ...
位運(yùn)算是二進(jìn)制的運(yùn)算方式 ... 你想做十進(jìn)制數(shù)字的位運(yùn)算操作的話先要將它們轉(zhuǎn)成二進(jìn)制 ...
如何手動(dòng)轉(zhuǎn)化進(jìn)制我就不贅述了 ... 你可以自己去看 ... 主要說位運(yùn)算 ...
假如我們有兩個(gè)數(shù)字 123 和 321 ... 轉(zhuǎn)化成二進(jìn)制之后是 001111011 和 101000001 ...
我們從字面意思上理解 ... 按位與
... 就是按照每一位做 與 這個(gè)操作 ... 如下 ...
001111011 & 101000001 ------------- 001000001 = 65
也就是說 123 & 321 = 65 ... 按位或
和 按位異或
皆同此理 ... 很簡(jiǎn)單我就不寫了 ...
按位非
... 單純的為當(dāng)前數(shù)字取反 ... 比如我們手動(dòng)計(jì)算 ~123 的過程如下 ...
~ 000 ... 001111011 --------------------- 111 ... 110000100 = 看上去很大的數(shù)字
我想這個(gè)問題你也注意到了 ... 把一個(gè)數(shù)字 按位非
之后 ... 前面會(huì)產(chǎn)生很多很多的 1 ...
會(huì)導(dǎo)致這個(gè)數(shù)字看上去非常大 ... 大到難以計(jì)算 ...
但事實(shí)上不是 ... 我們的操作系統(tǒng)無法存儲(chǔ)無限大的整數(shù) ...
事實(shí)上它只能存儲(chǔ)從 0 開始到 2 的 n 次方的所有數(shù)字 ... n 可以很大但不是無限大 ...
但這產(chǎn)生了一個(gè)新的問題 ... 就是操作系統(tǒng)不認(rèn)識(shí)負(fù)數(shù) ... 而負(fù)數(shù)又很常見 ...
所以人們又約定 ... 當(dāng)一個(gè)二進(jìn)制數(shù)字長(zhǎng)度是 n 且最高位是 1 的時(shí)候 ... 就表示這是一個(gè)負(fù)數(shù) ...
也就是操作系統(tǒng)接受了負(fù)的 2 的 n - 1 次方到 2 的 n 次方 - 1 這個(gè)范圍內(nèi)的整數(shù) ... 很完美 ...
回到問題上來 ... 那么看起來很大的這個(gè)數(shù)字其實(shí)是個(gè)負(fù)數(shù) ... 負(fù)多少呢 ..?
算法是這樣 ... 去掉最高位之后做按位非操作 ... 然后加上負(fù)號(hào)再減一 ...
也就是 ~123 = -(~(~123))-1 = -124 ... 原理很復(fù)雜但表現(xiàn)起來超簡(jiǎn)單 ...
接下來 左移
和 右移
... 一樣是字面的意思 ... 比如 123 << 2 ...
001111011 << 2 --------------- 00111101100 = 492
左移的時(shí)候空出來的位補(bǔ)零 ... 右移的時(shí)候多出去的位直接丟棄 ...
也就是說所有數(shù)字如果不停左移或者右移的話 ... 最后結(jié)果一定是 0 ...
寫到這兒突然感覺好像是在跟小朋友講基礎(chǔ)知識(shí)一樣 ... 嘛 ... 總之就是這樣啦 ...
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)