我想实现以下伪代码,其中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'。 –