Dlaczego 2 ^ 16 jest liczbą „specjalną”? [Zamknięte]

48

OK, czuję się głupio pytając o to - ale w artykule Jeffa: Właściwy ekran telefonu podczas rozmowy kwalifikacyjnej i pierwotnie zadane w 5 podstawowych pytaniach na ekranie telefonu :

Nie powinni patrzeć na ciebie tępo, kiedy pytasz z 2 ^ 16 jest. To specjalny numer. Powinni to wiedzieć.

Od jakiegoś czasu jestem programistą \ inżynierem oprogramowania \ małpką kodową \ i czymkolwiek, i nie sądzę, żebym się na to natknął. Mam na myśli, że z pewnością mogę liczyć wartości binarne, wykonuję na nich podstawowe operacje itp. Ale nie widzę, co jest „specjalnego” w tej wartości.

javamonkey79
źródło
6
To potęga 2? :)
Michael K
2
@Michael 2^16.1to także potęga 2, ale nic specjalnego. To samo dotyczy 2^0.
prawej
4
@Radek: 2**0jest 1, co w rzeczywistości jest bardzo specjalną liczbą;) Ale tak, generalnie zajmujemy się potęgami dwóch, gdzie wykładnik jest dodatnią liczbą całkowitą.
1
Dlaczego 10 ^ 3 lub 10 ^ 6 jest liczbą specjalną?
4
Czy to pytanie do wywiadu z lat 90.? 16 bitów było wtedy wyjątkowych
Chris S

Odpowiedzi:

81

(2, 16 - 1) lub 65535, lub 0xFFFFczy "64k" jest wartością maksymalną z 2 bajtów. Przez długi czas procesory korzystały z architektury 16-bitowej, a systemy operacyjne były również oparte na 16-bitowych operacjach i „słowach” . Były 16-bitowe polecenia i 16-bitowe adresy pamięci. Wiele systemów / kompilatorów nadal używa 16 bitów dla liczb całkowitych.

Tak więc (2 16-1 ) jest wyjątkowy, ponieważ jest to największa liczba, jaką może pomieścić 16-bitowa (niepodpisana) liczba całkowita i największy adres pamięci, do którego może uzyskać dostęp architektura 16-bitowa.

Travis Christian
źródło
23
Do Twojej wiadomości, jest to również liczba wierszy w arkuszu kalkulacyjnym Excel :)
Travis Christian
2
Czy to wciąż limit?
JeffO
6
Poprawiono mnie. Może minęło trochę czasu, odkąd przewinąłem do samego końca.
Travis Christian
3
@Travis: Ostatnie zdanie zawiera błąd „jeden po drugim”; 2 ^ 16 wymaga 17 bitów.
PSU
2
65535 to także najwyższy numer portu znaleziony w protokołach ipv4 (i ipv6?).
CoatedMoose
58

Z całego ciała z artykułu Steve'a Yegge,

Kandydaci powinni wiedzieć, jakie są bity i bajty. Powinny być w stanie liczyć w systemie binarnym; np. powinni umieć powiedzieć, co to jest 2 ^ 5 lub 2 ^ 10, w systemie dziesiętnym. Nie powinni patrzeć na ciebie tępo, kiedy pytasz z 2 ^ 16 jest. To specjalny numer. Powinni to wiedzieć.

Wyrzucono mnie z fragmentu, który zacytowałeś w pytaniu; brzmiało to tak, jakby kandydat powinien był w stanie opisać jego znaczenie, ale w kontekście mówi, że kandydaci powinni wiedzieć z góry, jaka jest konwersja dziesiętna 2 16 .

Znaczenie tego jest takie, że ponieważ my, ludzie, nadal używamy dziesiętnych do zliczania, szczególnie w naszych głowach (w większości przypadków), musimy znać przybliżone pojemności wspólnych bloków bajtów , których używamy do przechowywania, pamięci, a nawet kodowania znaków. Ponieważ bajt ma 8 bitów, najczęściej są to 8, 16, 24, 32 i 64.

W tej chwili powiedziałbym, że 2 32 to najczęściej występująca pojemność, z którą ma do czynienia deweloper. Jestem podejrzliwy w stosunku do programistów, którzy nie wiedzą, że 2 32 to około 4 miliardy (maksymalna wartość ~ 2 miliardy, jeśli podpisano), ponieważ oznacza to, że nigdy nie zadali sobie trudu, aby dowiedzieć się z grubsza, ile rekordów można przechowywać w ich bazach danych, które używaj 32-bitowych ints dla kluczy podstawowych, lub gdy stary kod używający 32-bitowych ints dla identyfikatorów, dat itp. będzie wymagał refaktoryzacji do wersji 64-bitowej. 1

2 16 to całkowita pojemność Javy short. (Łączna liczba między -2 15 a 2 15 -1)

Deweloper powinien na pamięć wiedzieć, co to jest 8-bit. Jednym z wielu powszechnych zastosowań jest kodowanie znaków ASCII.

Nie spodziewałbym się, że programista w ogóle zna 2 14 lub 2 18 , ale prawdopodobnie oczekiwałbym, że znają 2 16, ponieważ jest to bardzo często występująca liczba i wystarczająco krótka liczba (65536), aby łatwo zapamiętać pełny numer.


1: Jeśli przejrzysz tabele liderów Call of Duty: MW2 lub iPhone Game Center, często zobaczysz oszustów na szczycie z wysokimi wynikami w wysokości 2 147 483 647, co oznacza 2 31 -1, czyli maksymalną wartość ze znakowanej liczby całkowitej 2 32 .

Nicole
źródło
22
Warto pamiętać, że 2 ^ 10 to około tysiąca, a stamtąd dostajesz 2 ^ 20 to milion, a 2 ^ 30 miliard i tak dalej. I przy pomocy tego dość łatwo jest „zobaczyć”, że 2 ^ 14 to szesnaście milionów, więc możesz szybko dokonywać mentalnych konwersji między dwójkowym a dziesiętnym. A 2 ^ 64 to 16 * 10 ^ 18, czyli hmm ... 16 miliardów miliardów :)
Maglob
@Maglob, dzięki, dobra uwaga. Warto zauważyć, jak dotarłeś do 2 ^ 64, ponieważ zajęło mi to minutę. 1000 to 10 ^ 3, czyli mniej więcej 2 ^ 10. 64 to 4, a 60. 60/10 to 6, 6 * 3 to 18, więc dostajesz: 10 ^ 18 * (2 ^ 4 lub 16) ...
Nicole
2
Uhh Zrobiłem literówkę powyżej (i jakoś nie mogę jej edytować) 2 ^ 14 to oczywiście szesnaście tysięcy , a nie milion. (
Wydaje
+1 Dobra odpowiedź, ponieważ bardziej kompletnym kontekstem jest to, że szukasz osoby zdolnej do myślenia, aw szczególności do posiadania wiedzy na temat kontekstu i dziedziny.
szybko_niedz.
4
Um, ASCII jest 7-bitowy; ;-)
Brendan
3

Jedynym powodem, dla którego widzę 2 16 jako „specjalne”, jest to, że jest to jedna więcej niż najwyższa liczba całkowita, którą można zapisać w jednym rejestrze w 16-bitowym systemie operacyjnym.

Podobnie możesz zastosować tę samą logikę do 2 32 i 32-bitowych systemów operacyjnych.

Musiałbym wiedzieć więcej kontekstu dla pytania, zanim będę mógł powiedzieć, czy to znacząca wiedza, czy nie.

ChrisF
źródło
Przysięgam, że musiałem odfiltrować większość tego, co napisałeś. Wszystko, co widziałem, to 2 ^ 16 i najwyższa liczba całkowita.
ChaosPandion
6
To jest niedokładne. Całkowicie możliwe jest posiadanie 32-bitowego (lub wyższego) typu danych w 16-bitowym systemie operacyjnym. 16-bitowa liczba całkowita jest po prostu największą wartością, którą można zapisać w jednym rejestrze na 16-bitowym procesorze.
Chinmay Kanchi
@Chinmay - punkt zajęty;)
ChrisF