Re: [問題] 位元運算一問
※ 引述《Venividivici (不想後悔)》之銘言:
: 請問一下 C 或 C++ 有類似等價於 Java ">>>" 及 "<<<" 的用法嗎?
: 查了一下網路上的資訊是說 >>> 與 >> 的差別在於如果最左邊是 1, >>> 會保留
: 最左邊的 1 , 而 >> 則是直接補 0;
: 所以如果在 Java 中的寫法是 a = -1; b = a >>> 1;
: 在 C++ 中的寫法會等價於 a = -1; b = ( a >> 1 ) & ( 1000 0000 0000 0000 );
: 不知道這樣是正確的嗎?
應該說, Java 的這兩個符號規則是這樣
假設 a 是 11010101b
那麼 a >> 1 是 10101010b
其中最前面的 1 不變, 後面的位數往右移一位, 最左邊補零
而 a >>> 1 則是 01101010b
就是全部往右移, 最左邊補零
另一方面, C/C++ 的位元運算則是沒有在分正負, 都是對全部位元直接運算
所以 C/C++ 的 >> 和 Java 的 >>> 是等價的, 而沒有和 >> 等價的運算子
事實上其實不建議在 C/C++ 對有號整數進行位元運算, 因為可能溢位造成未定義行為
因為 C/C++ 標準並沒有定義負整數的表示法, 可能不是二的補數
在例如 01111111 << 1 的狀況, 出來的結果 (11111110) 代表多少其實不一定
而在無號整數的狀況下, Java 的 >> 和 >>> 行為也一模一樣
<< 和 <<< 就一樣了, 自己類推
--
Les grandes et les meilleurs tone from "Zadok the Priest"
Eine grosse stattliche Veranstaltung by F. Handel
THE MAIN EVENT! These are the men
Sie sind die Besten
"Champions League" by Tony Britten THESE ARE THE CHAMPIONS!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
→
01/10 01:28, , 1F
01/10 01:28, 1F
→
01/10 01:28, , 2F
01/10 01:28, 2F
→
01/10 01:34, , 3F
01/10 01:34, 3F
→
01/10 01:36, , 4F
01/10 01:36, 4F
→
01/10 10:21, , 5F
01/10 10:21, 5F
推
01/10 10:28, , 6F
01/10 10:28, 6F
討論串 (同標題文章)