Я хотел бы реализовать следующий псевдокод, где a
является байтом, а b
является байтом.Как использовать modulo с подписанными байтами?
(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
первые 3 из 4 байтов полученного Int
будут обрезаны, , который равен по модулю операции. Теперь функции f1
и f2
возвращают равные результаты. Протестировано со всеми 256 * 256 возможными вариантами ввода.
бы вернуть ваш метод значение вашего ожидаете? Например, если результат вашего 'mod' превышает 128, вы все равно получите отрицательный номер. – fdsa
Да, я ожидаю, что отрицательные значения будут возвращены в некоторых случаях. Я думаю, что с двоичной точки зрения все равно, но в контексте подписанного типа «Byte» наиболее значимый бит интерпретируется как знак значения. Я думаю, 0 => + и 1 => -. – user573215
Я подозреваю, что вы хотите, эквивалентно '& 0xFF'. –