Я пытаюсь создать обратную функцию для java.util.Random setSeed и следующих функций.По сути, я хочу иметь возможность вводить длинное значение (до его усечения до 48 бит) и возвращать начальное или семейство начальных значений, которое приведет к этому значению для первого вызова nextLong ().Соответствующий исходный код приведен ниже:
setSeed (long seed)
seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
next (целые биты)
//this function is called by nextLong()
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
Проблема возникает из-за второйчасть, так как целое число переполняется после умножения.Из-за этого я не могу просто разделить константу, так как это приведет к другому результату и НЕ даст мне правильное начальное число.
Я не очень разбираюсь в бинарных операциях, и мне было интересно,есть способ учесть это переполнение при делении для получения правильного начального числа без необходимости угадывать, каково было действительно большое число после умножения.