1 回答

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