Почему 2 ^ 16 является «специальным» числом? [закрыто]

48

Хорошо, я чувствую себя глупо, спрашивая об этом - но в статье Джеффа: «Правильный выбор экрана телефона для интервью», изначально изложенной в 5 основных вопросах экрана телефона :

Они не должны смотреть тупо на вас, когда вы спрашиваете с 2 ^ 16. Это особый номер. Они должны это знать.

Я был разработчиком \ инженером-программистом \ обезьяной кода \ кем бы то ни было некоторое время, и я не думаю, что когда-либо сталкивался с этим. Я имею в виду, что я, конечно, могу считать двоичные значения, выполнять с ними базовые операции и т. Д. И т. Д. Но я не вижу, что «особенного» в этом значении.

javamonkey79
источник
6
Это степень 2? :)
Майкл К
2
@Michael 2^16.1также является степенью 2, но ничего особенного. То же самое для 2^0.
rightfold
4
@Radek: 2**0есть 1, на самом деле это очень особенное число;) Но да, нас обычно касаются только степени двух, где показатель степени является положительным целым числом.
1
Ну, а почему 10 ^ 3 или 10 ^ 6 - это специальное число?
4
Это вопрос интервью из 90-х? 16 битов были особенными в то время
Крис S

Ответы:

81

(2 16 - 1), или 65535, или 0xFFFFили «64k» - максимальное значение 2 байта. Долгое время процессоры использовали 16-битную архитектуру, а операционные системы также основывались на 16-битных операциях и «словах» . Были 16-битные команды и 16-битные адреса памяти. Многие системы / компиляторы все еще используют 16 бит для целых чисел.

Таким образом, (2 16 - 1) является особенным, поскольку это наибольшее число, которое может содержать 16-разрядное (беззнаковое) целое число, и самый большой адрес памяти, к которому может обращаться 16-разрядная архитектура.

Трэвис Кристиан
источник
23
К вашему сведению, это также количество строк в электронной таблице Excel :)
Travis Christian
2
Это все еще предел?
JeffO
6
Я стою исправлено. Может быть, прошло много времени с тех пор, как я прокрутил весь путь вниз.
Трэвис Кристиан
3
@Travis: в последнем предложении есть ошибка «один за другим»; 2 ^ 16 требует 17 бит.
БП,
2
65535 также является самым большим номером порта, найденным в протоколах ipv4 (и ipv6?).
CoatedMoose
58

Из всего тела из статьи Стива Йегге,

Кандидаты должны знать, что такое биты и байты. Они должны быть в состоянии считать в двоичном виде; например, они должны быть в состоянии сказать вам, что такое 2 ^ 5 или 2 ^ 10 в десятичном виде. Они не должны смотреть тупо на вас, когда вы спрашиваете с 2 ^ 16. Это особый номер. Они должны это знать.

Меня отбросило то, что вы указали в вопросе; Похоже, что кандидат должен быть в состоянии описать его значение, но в контексте он говорит, что кандидаты должны знать, из головы, что такое десятичное преобразование 2 16 .

Значение этого заключается в том, что, поскольку мы, люди, все еще используем десятичные числа для подсчета, особенно в наших головах (в большинстве случаев), нам необходимо знать грубые возможности общих байтовых блоков, которые мы используем для хранения, памяти или даже кодировки символов. Поскольку байт составляет 8 бит, наиболее распространенными являются 8, 16, 24, 32 и 64.

В настоящее время я бы сказал, что 32 - это наиболее часто встречающаяся мощность, с которой имеет дело разработчик. Я с подозрением отношусь к разработчикам, которые не знают, что 2 32 - это примерно 4 миллиарда (максимальное значение ~ 2 миллиарда, если подписано), поскольку это означает, что они никогда не удосужились узнать примерно, сколько записей может храниться в их базах данных, используйте 32-битные ints для первичных ключей, или когда старый код, использующий 32-битные ints для идентификаторов, дат и т. д., должен быть реорганизован в 64-битный. 1

2 16 - общая емкость Java short. (Общее число от -2 15 до 2 15 -1)

Разработчик должен знать наизусть, что такое 8-битный. Среди многих распространенных применений - кодировка символов ASCII.

Я бы не ожидал, что программист вообще знает 2 14 или 2 18 , но я бы, вероятно, ожидал, что они знают 2 16, поскольку это очень часто встречающееся число и достаточно короткое число (65536), чтобы легко запомнить полное число.


1: Если вы просматриваете списки лидеров Call of Duty: MW2 или iPhone Game Center, вы часто будете видеть читеров наверху с высокими показателями 2 147 483 647, что составляет 2 31 -1, максимальное значение целого числа со знаком 2 32 .

Николь
источник
22
Хорошо помнить, что 2 ^ 10 - это около тысячи, и оттуда вы получаете 2 ^ 20 - миллион, а 2 ^ 30 - миллиард и так далее. И с помощью этого довольно легко «увидеть», что 2 ^ 14 - это шестнадцать миллионов, так что вы можете быстро сделать умственные преобразования между двоичным и десятичным. И 2 ^ 64 это 16 * 10 ^ 18, что хм ... 16 миллиардов миллиардов :)
Maglob
@Maglob, спасибо, хорошая мысль. Стоит отметить, как вы пришли к 2 ^ 64, так как это заняло у меня минуту. 1000 - это 10 ^ 3, что примерно равно 2 ^ 10. 64 - это 4 и 60. 60/10 - это 6, 6 * 3 - это 18, поэтому вы получите: 10 ^ 18 * (2 ^ 4 или 16) ...
Николь
2
Uuh. Я сделал вышеописанную опечатку (и как-то не могу ее отредактировать) 2 ^ 14 - это, конечно, шестнадцать тысяч , а не миллион. (Я думаю, что это было не так просто "увидеть" в конце концов :)
Maglob
+1 Хороший ответ, потому что более полный контекст - это то, что вы ищете человека, способного мыслить и, в частности, иметь знания о контексте и предметной области.
quick_now
4
Хм, ASCII 7-битный .. ;-)
Брендан
3

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

Точно так же вы можете применить ту же логику для 32- и 32-разрядных операционных систем.

Мне нужно знать больше контекста для вопроса, прежде чем я смогу сказать, было ли это значительным знанием или нет.

ChrisF
источник
Клянусь, я отфильтровал большую часть того, что ты написал. Все, что я видел, было 2 ^ 16 и самое высокое целое число.
ChaosPandion
6
Это неточно. Вполне возможно иметь 32-битный (или выше) тип данных в 16-битной операционной системе. 16-разрядное целое число - это просто наибольшее значение, которое можно сохранить в одном регистре на 16-разрядном процессоре.
Чинмай Канчи
@Chinmay - точка взята;)
ChrisF