我想實現以下僞代碼,其中a
是一個字節,b
是一個字節。如何使用帶符號字節的模數?
(a + b) mod 256
我會像下面的代碼片段一樣在Scala中編寫它,但我不認爲它們會對Java有顯着的區別。
因此,如果字節值的範圍從0到255(含)我可以這樣寫:
(a + b) % 256
但Java/Scala的類型Byte
簽署,範圍從-128到127(含)。我可以這樣寫:
def f1(a: Byte, b: Byte): Byte = (((a + 128 + b + 128) % 256) - 128).toByte
這似乎是不必要的複雜給我,但我不知道%
負值的行爲。另外我不知道這個函數是否可以用xor或類似的東西來簡化。
如何根據類型Byte
實現並簡化功能?
或更一般:
如何使用模有符號字節?
編輯:
從上面的函數f1是不正確的。它應該是:
def f1(a: Byte, b: Byte): Byte = ((a + b + 128) % 256 - 128).toByte
因此,我與簡化版本的比較是錯誤的。所以這個簡化的方式應該工作:
def f2(a: Byte, b: Byte): Byte = (a + b).toByte
兩個值隱式轉換爲Int
值和相加。當將其轉換回Byte
時,所得到的Int
的4個字節中的前3個將被刪除,等於模運算。功能f1
和f2
現在返回相同的結果。測試所有256 * 256可能的輸入變化。
請問你的方法返回你的期待值?例如,如果你的'mod'的結果超過了128,你將會有一個負數。 – fdsa
是的,我預計在某些情況下會返回負值。我想從二進制的角度來看,它們都是一樣的,但在簽名的「字節」類型的情況下,最重要的位被解釋爲值的符號。我認爲0 => +和1 => - 。 – user573215
我懷疑你想要的就是'&0xFF'。 –