亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我想知道的是應該怎么算,就是提前可以知道這個運算的結果?

我想知道的是應該怎么算,就是提前可以知道這個運算的結果?

PHP
素胚勾勒不出你 2023-04-26 19:15:12
關于php的位運算 手冊中 是這樣介紹的例子 名稱 結果$a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。$a | $b Or(按位或) 將把 $a 或者 $b 中為 1 的位設為 1。$a ^ $b Xor(按位異或) 將把 $a 和 $b 中不同的位設為 1。~ $a Not(按位非) 將 $a 中為 0 的位設為 1,反之亦然。$a << $b Shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示“乘以 2”)。$a >> $b Shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示“除以 2”)。比如說12 & 13134 | 23498 ^ 7等等 這些
查看完整描述

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 ...

寫到這兒突然感覺好像是在跟小朋友講基礎知識一樣 ... 嘛 ... 總之就是這樣啦 ...


查看完整回答
反對 回復 2023-04-29
  • 1 回答
  • 0 關注
  • 133 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號