2016-01-07 90 views
1

我整明白,它改變了位在什麼是左,右移位位運算符的使用>><<和

0000 0000 0000 0000 0000 0000 0000 0111 << 1 
0000 0000 0000 0000 0000 0000 0000 1110 

但是,你爲什麼要使用這些左和右移位運算符代替只是輸入數字,哪些使用這些操作員實際上有好處。

我看到很多#2回答,哪些運營商來完成的,但從來沒有人說他們爲什麼會使用它在只輸入了12345所以就像我說的,爲什麼使用它們,什麼是他們的利益在剛鍵入號碼你試圖得到什麼?

我碰到這個代碼就在瀏覽GitHub上一包:

// ClientVersion is the protocol version that Client implements. 
const ClientVersion = 1<<16 | 3<<8 | 0 

其中數出來是:66304

因此,如果這是一個常量,爲什麼不直接輸入const ClientVersion = 66304爲什麼使用運營商。

回答

2

如果假定a一個整數,然後a << xa通過2^xa >> xb通過2^x,在您使用整數除法。

在你描述的情況下,我看不到使用1<<16 | 3<<8 | 0而不是66304(show-off除外,你可以使用按位運算符,這在愚蠢的意見中是愚蠢的)的真正好處。

但有些方法,我認爲他們是合理的(看看這question about iota constants)。

其他幾個例子(不僅要轉到相關的):

  • 檢查,如果第n個位設置x & (1<<n)
  • 設定的第n個位x | (1<<n)
  • 許多其他操作,其中n位。
+6

好處是程序員可以即時查看和維護版本號(16.3.0)。 (我假設每個主要/次要/補丁版本都有8位字段)。如果版本號更改,編譯器將處理計算。數字66304告訴我們什麼都沒有,我們必須解析它來找出嵌入的領域。 – BraveNewCurrency

+1

爲了防止任何人感到困惑,我確信@BraveNewCurrency意味着(1.3.0)的邏輯版本,這是將semver編碼爲一個小整數的一種非常好的方式。 – JimB

+0

哎呀,你是對的。 – BraveNewCurrency

0

如果您需要較小的內存佔用空間,可以使用一個字節來保存256個不同的選項,而不是使用大字符串數組或更多字節,那麼您將使用這些選項。

嵌入式系統利用按位操作來打開/關閉選項,任何需要有點自我可持續性且不依賴於豐富的外部數據存儲的系統都將受益於此技術。

+0

人們是否知道他們頭頂上的每個位組合?我將不得不使用某種轉換或某些東西來找出我需要的東西 – Datsik

+0

@Datsik基本操作是您需要學習精通按位操作(或至少無需擔心地看它們)的所有操作。基本的掩蔽和位翻轉會讓你開始爲更難的東西奠定堅實的基礎。 –

+0

@Datsik:這些都是程序員應該熟悉的東西,至少他們可以讀取其他代碼,比如在stdlib中:https://golang.org/src/encoding/binary/binary.go?#L58 。這些與功能https://graphics.stanford.edu/~seander/bithacks.html的大量功能的其他按位操作緊密相關。 Bitfields和btmasks非常普遍,你甚至可能在不知道它的情況下始終與它們進行交互。 – JimB

相關問題