2017-02-12 2 views
0

Я связываю, чтобы создать линейный конгруэнтный генератор случайных чисел, и я хочу выбрать, скажем, первые 16 бит шестнадцатеричного значения в 64-разрядной форме. Как я могу это сделать в java? Я уже создал (очень) базовое число, основанное на времени суток.Манипулирование шестнадцатеричными значениями в java

Моя формула:

семян = 0x5D588B656C078965L * cal.get (Calendar.HOUR_OF_DAY) + 0x0000000000269EC3;

Я просто хочу выбрать первые 16 бит этого, я пытался подумать, как я буду делать это с целым числом, но я не думаю, что могу применять те же понятия здесь. Благодаря!

+0

'new Random(). Next (16);' https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – markspace

+0

'int sixteenLeastSignificantBits = ((int) longValue) & 0xFFFF; '? –

ответ

0

Если вы хотите иметь длинный, который имеет первые 16 бит и нули в других позициях, вы можете использовать битовую маску или сдвиг.

Предполагая, что на «первые 16 бит» вы имеете в виду биты высшего порядка, то маска выглядит следующим образом:

long mask = 0xffff000000000000; 

так что «1» в каждой битовой позиции, которую вы хотите сохранить, и 0 в другом месте. Затем сделать логическое «и» это с оригинальным целым:

long result = seed & mask; 

Другим способом переложить оригинал на правильные 48 бит, затем снова налево 48 бит.

+0

Это действительно круто! спасибо, я слышал о бит-масках раньше, но я только на первом курсе университета, поэтому у меня мало опыта. –

+0

Я думаю, что поучительно выработать то, что происходит на бит-уровне - для каждого '1 'в маске «1» или «0» будет проходить из оригинала без изменений; для каждого «0» в маске вы всегда получите 0 результат операции «и». Вы можете использовать аналогичную логику для значений * установки *, используя операцию «или», с «1» в местах, где вы хотите установить бит. – arcy

+0

Помните, что на StackOverflow, если на ваш вопрос будет дан ответ, отметьте его как ответ; если какой-либо ответ поможет вам, поддержите его. Так поддерживаются репутации. – arcy

0

Бит переключения:

long value = seed >>> 48; 

или вы можете сохранить его в int:

int value = (int)(seed >> 48); 

Обычно, вы бы использовать последние биты от семени, чтобы произвести случайное число, которое (например, «более случайный»), поэтому:

seed & 0xFFFF 
+0

Спасибо! Я бы поднял, но у меня еще нет достаточной репутации. –

+0

На самом деле вам даже не нужна переменная, вы можете просто «семя >>> 48» напрямую – Bohemian

Смежные вопросы