2016-08-08 12 views
2

я шел через go учебник по golang.org, и я наткнулся на пример, который я частично понимаю ...Как этот битхифтинг работает в этом примере?

MaxInt uint64  = 1<<64 - 1 

Теперь я понимаю, что это смещаться Бит 64 места влево, которые сделали бы это 1, а затем 64 0.

Мой вопрос: почему это максимальное целое число, которое может быть достигнуто в 64-битном номере. Не будет ли максимальное целое число 111111111....(until the 64th 1) вместо 100000...(until the 64th one)?

+1

'1 << 64 = 10000000000000000' (hex)' 1 << 64 - 1 = FFFFFFFFFFFFFFFF' (hex), который является самым большим * неподписанным * 64-битным целым числом, которое может быть сохранено в системе нумерации * twos-compliment * , (если вы все еще застряли, '1 << 64' - это номер' 65', а не '64') –

+1

ahh ok, поэтому, вычитая 1, вы делаете 65-й бит исчезающим, оставляя' 111111 ..... '? – deltaskelta

+1

Да, вы поняли! (но оставление 'FFFF ... (16 шестнадцатеричных цифр)' или '1111 .... (64 двоичных 1s') –

ответ

1

Что здесь происходит, шаг за шагом:

  1. Возьмите 1.

  2. Сдвиг его влево на 64 бит. Это сложно. В результате для представления требуется 65 бит, а именно 1, а затем 64 нули. Поскольку мы вычисляем значение 64 бит здесь, почему это даже компилируется, а не переполняется до 0 или 1 или создает ошибку компиляции?

  3. Это работает, потому что арифметика, используемая для вычисления констант в Go, немного мала (https://blog.golang.org/constants) тем, что она не имеет никакого отношения к типу вычисленной именованной константы. Вы можете сказать foo uint8 = 1<<415/1<<414 и foo сейчас 2.

  4. Вычитание 1. Это возвращает нас к 64-битным номерам, так как на самом деле это 11 .... 1 (64 раза), что действительно является максимальным значением uint64. Без этого шага компилятор будет жаловаться на то, что мы попытаемся перевести 65-битное значение в uint64.

  5. Назовите константу MaxInt и укажите тип uint64. Успех!

Магическая арифметика, используемая для вычисления констант, по-прежнему имеет ограничения (очевидно). Сдвиги более 500 или около того производят смешные имена с ошибками stupid shift.