¿Por qué 2 ^ 16 es un número "especial"? [cerrado]

48

De acuerdo, me siento estúpido al preguntar esto, pero en el artículo de Jeff: Cómo obtener la pantalla del teléfono de la entrevista correctamente y originalmente en las 5 preguntas esenciales de la pantalla del teléfono :

No deberían mirarlo fijamente cuando pregunta con 2 ^ 16 es. Es un número especial. Deberían saberlo.

He sido desarrollador \ ingeniero de software \ code monkey \ lo que sea por un tiempo, y creo que nunca me he encontrado con esto. Quiero decir, ciertamente puedo contar valores binarios, hacer operaciones básicas en ellos, etc., etc. Pero no veo qué tiene de especial este valor.

javamonkey79
fuente
66
Es un poder de 2? :)
Michael K
2
@Michael 2^16.1también tiene una potencia de 2, pero nada especial. Lo mismo para 2^0.
derecha
44
@Radek: 2**0es 1, que de hecho es un número muy especial;) Pero sí, generalmente solo nos interesan las potencias de dos donde el exponente es un número entero positivo.
1
Bueno, ¿por qué 10 ^ 3 o 10 ^ 6 es un número especial?
44
¿Es esta una pregunta de entrevista de los años 90? 16 bits eran especiales en ese entonces
Chris S

Respuestas:

81

(2 16 - 1) o 65535 o 0xFFFF"64k" es el valor máximo de 2 bytes. Durante mucho tiempo, las CPU utilizaron una arquitectura de 16 bits y los sistemas operativos también se basaron en operaciones de 16 bits y "palabras" . Había comandos de 16 bits y direcciones de memoria de 16 bits. Muchos sistemas / compiladores todavía usan 16 bits para enteros.

Entonces, (2 16 - 1) es especial porque es el número más grande que puede contener un entero de 16 bits (sin signo) y la dirección de memoria más grande a la que puede acceder una arquitectura de 16 bits.

Travis Christian
fuente
23
Para su información, también es el número de filas en una hoja de cálculo de Excel :)
Travis Christian
2
¿Sigue siendo ese el límite?
JeffO
66
Estoy corregido. Tal vez ha pasado un tiempo desde que me desplacé hacia abajo.
Travis Christian
3
@Travis: la última oración tiene un error off-by-one; 2 ^ 16 requiere 17 bits.
PSU
2
65535 es también el número de puerto más alto que se encuentra en los protocolos ipv4 (y ipv6?).
CoatedMoose
58

Del cuerpo completo del artículo de Steve Yegge,

Los candidatos deben saber qué bits y bytes son. Deberían poder contar en binario; por ejemplo, deberían poder decirte qué es 2 ^ 5 o 2 ^ 10, en decimal. No deberían mirarlo fijamente cuando pregunta con 2 ^ 16 es. Es un número especial. Deberían saberlo.

Me desconcertó la parte que usted citó en la pregunta; Parecía que un candidato debería ser capaz de describir su importancia, pero en contexto está diciendo que los candidatos deberían saber, fuera de la cabeza, cuál es la conversión decimal de 2 16 .

La importancia de esto es que dado que los humanos todavía usamos decimales para contar, especialmente en nuestras cabezas (en la mayoría de las circunstancias), necesitamos conocer las capacidades aproximadas de los bloques de bytes comunes que usamos para el almacenamiento, la memoria o incluso la codificación de caracteres. Como un byte es de 8 bits, los más comunes son 8, 16, 24, 32 y 64.

En la actualidad, diría que 2 32 es la capacidad más común con la que se enfrenta un desarrollador. Sospecho de los desarrolladores que no saben que 2 32 es aproximadamente 4 mil millones (valor máximo de ~ 2 mil millones si está firmado), ya que significa que nunca se han molestado en averiguar aproximadamente cuántos registros se pueden almacenar en sus bases de datos que use s de 32 bits intpara las claves primarias, o cuando el código antiguo que usa s de 32 bits intpara ID, fechas, etc., deba refactorizarse a 64 bits. 1

2 16 es la capacidad total de Java short. (Números totales entre -2 15 y 2 15 -1)

Un desarrollador debe saber de memoria qué es 8 bits. Entre los muchos usos comunes está la codificación de caracteres ASCII.

No esperaría que un programador supiera 2 14 o 2 18 , pero probablemente esperaría que supiera 2 16 ya que es un número muy común y un número lo suficientemente corto (65536) para recordar fácilmente el número completo.


1: Si navega en las tablas de clasificación de Call of Duty: MW2 o iPhone Game Center, a menudo verá tramposos en la parte superior con valores de puntaje altos de 2,147,483,647, que es 2 31 -1, el valor máximo de un entero de 2 32 firmado .

Nicole
fuente
22
Una buena cosa para recordar es que 2 ^ 10 es aproximadamente mil, y de allí obtienes 2 ^ 20 es un millón, y 2 ^ 30 mil millones y así sucesivamente. Y con la ayuda de esto es algo fácil "ver" que 2 ^ 14 son dieciseis millones, por lo que puede hacer conversiones mentales rápidamente entre binario y decimal. Y 2 ^ 64 es 16 * 10 ^ 18, que es hmm ... 16 mil millones billones :)
Maglob
@Maglob, gracias, buen punto. Vale la pena señalar cómo llegaste a 2 ^ 64, ya que me tomó un minuto. 1000 es 10 ^ 3, que es aproximadamente 2 ^ 10. 64 es 4 y 60. 60/10 es 6, 6 * 3 es 18, por lo que obtienes: 10 ^ 18 * (2 ^ 4 o 16) ...
Nicole
2
Uuh Hice un error tipográfico arriba (y de alguna manera no puedo editarlo) 2 ^ 14 es, por supuesto, dieciséis mil , no millones. (Supongo que no fue tan fácil "ver" después de todo :)
Maglob 02 de
+1 Buena respuesta, porque un contexto más completo es que estás buscando a la persona capaz de pensar y, en particular, tener conocimiento del contexto y el dominio.
rápidamente_abr
44
Um, ASCII es de 7 bits ... ;-)
Brendan
3

La única razón por la que puedo ver que 2 16 es "especial" es porque es uno más que el número entero más alto que puede almacenar en un solo registro en un sistema operativo de 16 bits.

Del mismo modo, podría aplicar la misma lógica a 2 sistemas operativos de 32 y 32 bits.

Necesito saber más contexto para la pregunta antes de poder decir si fue un conocimiento significativo o no.

ChrisF
fuente
Juro que debo haber filtrado la mayor parte de lo que escribiste. Todo lo que vi fue 2 ^ 16 y el número entero más alto.
ChaosPandion 01 de
66
Esto es inexacto. Es perfectamente posible tener un tipo de datos de 32 bits (o superior) en un sistema operativo de 16 bits. Un número entero de 16 bits es simplemente el valor más grande que se puede almacenar en un solo registro en un procesador de 16 bits.
Chinmay Kanchi
@Chinmay - punto tomado;)
ChrisF