Blog en español

Patrones de bits en Java para entrevistas técnicas

10 de mayo de 202620 min de lectura
Patrones de bits en Java para entrevistas técnicas

Domina patrones de bits en Java con XOR, máscaras y desplazamientos para entrevistas técnicas. Aprende a resolverlos rápido y sin fallar.

Saber qué hace `&` no es el problema. El problema es estar en una prueba de programación, mirando una pregunta sobre arrays, y no reconocer que el entrevistador incrustó discretamente un patrón de entrevista de Java con operadores bit a bit tres niveles más abajo en el enunciado. La mayoría de los candidatos que tienen dificultades con preguntas de manipulación de bits pueden nombrar correctamente cada operador. Se bloquean porque no han interiorizado el pequeño conjunto de patrones reutilizables — comprobaciones de paridad, máscaras, trucos con XOR, trampas del desplazamiento con signo — que reaparecen una y otra vez disfrazados de distintas formas. Esta guía omite la trivia de los operadores y enseña esos patrones directamente, con simulaciones paso a paso y código Java que puede reconstruir de memoria bajo presión.

Por qué los trucos con bits importan cuando la prueba deja de ser teórica

La trampa no es la sintaxis — es el reconocimiento de patrones

Una prueba de programación típica no pregunta: "¿qué hace el operador `^`?" Pregunta: "encuentre el único número de un array en el que todos los demás elementos aparecen dos veces". La pregunta parece un problema de arrays. En realidad, es un problema de XOR disfrazado. Todo número XOR con sí mismo produce cero. Todo número XOR con cero devuelve el mismo número. Así que, si procesa todo el array con XOR, los duplicados se anulan y el elemento único sobrevive. Los candidatos que conocen el operador pero no han visto el patrón pasan cinco minutos recurriendo a mapas de frecuencias. Los que reconocen el patrón escriben tres líneas.

Esa distancia — entre conocer la sintaxis y reconocer el patrón — es lo que realmente se está evaluando en una entrevista de Java con operadores bit a bit. Los operadores son un vocabulario pequeño. Los patrones son la gramática que permite decir algo útil con ellos.

Cómo se ve esto en la práctica

Suponga que el enunciado dice: "Dado un entero, determine si es impar o par sin usar el operador módulo". Una respuesta débil menciona `%` y luego cambia de tema de forma torpe. Una respuesta sólida dice: "Esto es una comprobación de paridad. El bit menos significativo de cualquier entero indica su paridad: 1 significa impar, 0 significa par. Así que haré AND del número con 1 y comprobaré el resultado". Después escribe la máscara, luego simula 17 en binario (`10001`), y por último dice que la complejidad temporal es O(1).

En una sesión simulada que revisé, a un candidato le dieron el enunciado de "encuentre el único número" y de inmediato empezó a construir un mapa de frecuencias. Cuando le insinuaron que pensara en las propiedades de XOR, hizo una pausa, escribió `a ^ a = 0` al margen y la solución encajó en menos de treinta segundos. El conocimiento estaba ahí. Lo que faltaba era el disparador del patrón. Esa es la brecha que cierra esta guía.

Según la investigación de SHRM sobre contratación técnica, las pruebas de programación usan cada vez más problemas basados en patrones precisamente porque revelan si los candidatos entienden los principios subyacentes en lugar de soluciones memorizadas.

Aprenda los operadores una vez y deje de tratarlos como trivia

AND, OR, XOR y NOT hacen trabajos distintos — y en entrevistas importan los cuatro

Los operadores bit a bit de Java trabajan sobre los bits individuales de valores enteros, no sobre tablas de verdad booleanas. Esa diferencia importa porque `&` y `&&` no son lo mismo — `&&` hace cortocircuito y devuelve un booleano; `&` evalúa ambos lados y devuelve un entero. Los entrevistadores exploran exactamente esta confusión.

  • `&` (AND): un bit es 1 solo cuando ambas entradas son 1. Úselo para aislar o probar bits específicos.
  • `|` (OR): un bit es 1 cuando al menos una entrada es 1. Úselo para establecer bits sin alterar los demás.
  • `^` (XOR): un bit es 1 cuando las entradas difieren. Úselo cuando quiera alternancia o comportamiento de cancelación.
  • `~` (NOT): invierte todos los bits. Este suele sorprender porque interviene el complemento a dos.

XOR es el operador que más tiempo de entrevista suele acaparar porque es reversible. `a ^ b ^ b == a`. Esa reversibilidad es lo que hace que funcione el patrón de "encontrar el único número" y lo que hace posible el intercambio con XOR.

Por qué el complemento a dos hace que ~ parezca extraño la primera vez

En Java, los enteros son valores con signo de 32 bits almacenados en complemento a dos. Cuando aplica `~` a 5, no obtiene -5. Obtiene -6. La fórmula es `~n = -(n + 1)`. Esto sorprende a los candidatos que esperan que NOT a nivel de bits se comporte como un simple cambio de signo.

El complemento a dos representa los números negativos invirtiendo todos los bits y sumando 1. Así que 5 en binario es `00000000 00000101`. Invierta todos los bits: `11111111 11111010`. Eso es -6 en complemento a dos, no -5. A los entrevistadores les encanta preguntar "¿qué devuelve `~5` en Java?" porque la respuesta incorrecta (-5) revela un hueco en el modelo mental.

Cómo se ve esto en la práctica

Ejecutar esto usted mismo antes de una entrevista vale más que leer una definición. La salida de `~a` es la que rompe el modelo mental ingenuo. Una vez que vea salir `-13` de `~12`, la regla del complemento a dos se queda grabada.

La Especificación del Lenguaje Java cubre de forma autoritativa la semántica de los operadores bit a bit y la representación de enteros en complemento a dos; es la fuente definitiva cuando un entrevistador discute su respuesta.

Use un bit para responder rápido a la pregunta de impar o par

Por qué n & 1 gana a la versión extensa

La manipulación de bits en Java hace trivial comprobar la paridad una vez que entiende por qué funciona la máscara. La representación binaria de cada entero tiene un bit menos significativo (LSB). Si el LSB es 1, el número es impar. Si es 0, el número es par. La máscara `1` en binario es `00000001`. Hacer AND de cualquier número con `1` pone a cero todos los bits excepto el LSB, así que el resultado es 0 o 1.

Esto no es solo un atajo ingenioso. Es O(1), sin división, sin módulo y sin ramificaciones más allá del retorno. En una entrevista, explicar la máscara — no solo usarla — es lo que separa a un candidato que memorizó el truco de uno que lo entiende.

Cómo se ve esto en la práctica

Simule 17 y 24:

  • 17 en binario: `10001`. AND con `00001` → `00001` → el resultado es 1 → impar.
  • 24 en binario: `11000`. AND con `00001` → `00000` → el resultado es 0 → par.

Escriba este método desde cero en la entrevista. Nombre la máscara. Recorra un valor de entrada en binario. Indique la complejidad. Esa es la respuesta completa: no hace falta módulo ni disculpas por usar un truco bit a bit.

Una nota sobre rendimiento: `n & 1` no es significativamente más rápido que `n % 2` en JVM modernas para una sola llamada. El valor de conocer este patrón es el reconocimiento de patrones, no la microoptimización. No venda en exceso el argumento de velocidad; el entrevistador podría objetarlo.

Establezca, borre y alterne un bit sin fallar con la máscara

La máscara es la idea real, no el operador

Las preguntas de entrevista sobre máscaras de bits casi siempre se reducen a tres operaciones: establecer un bit a 1, borrarlo a 0 o alternarlo. Cada una usa un operador distinto, pero la máscara se construye igual siempre: `1 << i` desplaza un 1 a la posición `i`, dándole una máscara con exactamente un bit activado.

  • Establecer el bit i: `n | (1 << i)` — OR fuerza el bit a 1 independientemente de su estado actual.
  • Borrar el bit i: `n & ~(1 << i)` — NOT invierte la máscara para que el bit i sea 0, y AND preserva todo lo demás.
  • Alternar el bit i: `n ^ (1 << i)` — XOR invierte solo el bit i.

El error común es confundir la posición del bit con el valor de la máscara. La posición 2 significa que la máscara es `1 << 2 = 4`, no `2`. Escribir `n & ~2` cuando quiere borrar el bit 2 borra el bit 1 en su lugar. Ese es un error silencioso que los entrevistadores observan con atención.

Cómo se ve esto en la práctica

Tome `n = 13` (binario `1101`) y la posición de bit 2.

  • Establecer bit 2: `13 | (1 << 2)` → `1101 | 0100` → `1101` → 13 (el bit 2 ya estaba establecido)
  • Borrar bit 2: `13 & ~(1 << 2)` → `1101 & 1011` → `1001` → 9
  • Alternar bit 2: `13 ^ (1 << 2)` → `1101 ^ 0100` → `1001` → 9

Después de mostrar esta simulación, la pregunta de seguimiento casi siempre es: "¿Por qué `|` para establecer y no `^`?" Porque XOR alternaría — si el bit ya es 1, XOR lo borra. OR siempre lo establece. Esa distinción es la respuesta.

La precedencia de operadores es donde los candidatos pierden puntos sin darse cuenta

Expresiones mixtas como `1 << i & n` son una trampa. En Java, `&` tiene menor precedencia que `<<`, así que esto se evalúa como `1 << (i & n)` — no como usted pretendía. Ponga siempre paréntesis: `(1 << i) & n`.

La tabla de precedencia de operadores de Java en los tutoriales oficiales es la referencia que conviene guardar. Escribir `(1 << i)` con paréntesis explícitos también mejora la claridad del código: le indica al entrevistador que conoce la regla de precedencia lo suficiente como para no depender de ella.

Deje de repetir el XOR swap como truco y empiece a explicar por qué funciona

XOR swap es famoso porque parece ingenioso, no porque siempre sea útil

XOR swap aparece en casi cualquier conversación sobre operadores bit a bit y desplazamientos en Java, y la mayoría de los candidatos lo presenta como un truco de feria. La verdadera lección es la reversibilidad: XOR es su propio inverso. `a ^ b ^ b == a`. Esa propiedad es lo que hace que el intercambio funcione, y es la misma propiedad que hace funcionar la solución de "encuentre el único número". Entender la reversibilidad conecta el truco con un patrón más amplio.

En código de producción, XOR swap casi nunca se usa: una variable temporal es más clara y el compilador JIT lo maneja con eficiencia. Los entrevistadores que preguntan por XOR swap están comprobando si entiende por qué funciona, no si ha memorizado tres líneas.

Cómo se ve esto en la práctica

Recorra cada paso: después de la línea 1, `a` contiene el XOR de ambos valores. La línea 2 recupera el `a` original en `b` haciendo XOR de nuevo. La línea 3 recupera el `b` original en `a`. Funciona porque XOR es reversible.

La única situación en la que falla: si `a` y `b` son la misma variable (la misma dirección de memoria, no solo el mismo valor), los tres XOR producen cero y pierde el valor por completo. Dígalo en la entrevista. Muestra que entiende el mecanismo, no solo la secuencia.

La referencia algorítmica de GeeksforGeeks menciona el intercambio con XOR como un patrón estándar de entrevista, aunque señala que es poco práctico en código real; ese enfoque es exactamente el correcto.

Cuente los bits activados como esperan realmente los entrevistadores

El bucle ingenuo está bien — hasta que el entrevistador pide algo mejor

Las preguntas de entrevista sobre conteo de bits activados suelen empezar con el enfoque ingenuo y luego escalar. El bucle ingenuo desplaza a la derecha y comprueba el LSB en cada iteración, ejecutándose en O(número de bits) — O(32) para un `int` de Java, lo cual es prácticamente O(1), pero resulta poco satisfactorio cuando el entrevistador dice "¿puede hacerlo mejor?".

El enfoque mejor es el algoritmo de Brian Kernighan: `n & (n - 1)` borra el bit activado más bajo en una sola operación. En vez de iterar por las 32 posiciones de bit, itera solo sobre los bits activados. Para un número con k bits activados, el bucle se ejecuta exactamente k veces.

Cómo se ve esto en la práctica

Tome `n = 29`, binario `11101`. Tiene cuatro bits activados.

Simulación paso a paso:

  • `29 & 28` → `11101 & 11100` → `11100` (28), count = 1
  • `28 & 27` → `11100 & 11011` → `11000` (24), count = 2
  • `24 & 23` → `11000 & 10111` → `10000` (16), count = 3
  • `16 & 15` → `10000 & 01111` → `00000` (0), count = 4

El bucle termina. Cuatro iteraciones para cuatro bits activados.

Lo que los candidatos fuertes dicen en voz alta

Nombre el invariante: "`n & (n - 1)` siempre borra exactamente el bit activado más bajo, porque restar 1 voltea los ceros finales y el 1 más bajo". Indique la complejidad: "O(k), donde k es el número de bits activados, que como máximo es O(32) para un `int` de Java". Mencione la función integrada: "Java también ofrece `Integer.bitCount(n)` — conviene nombrarla, pero normalmente el entrevistador quiere ver la implementación manual". Ese discurso es la diferencia entre un candidato que conoce la respuesta y uno que puede enseñarla.

La documentación de la clase Integer de Java cubre `Integer.bitCount()`; es útil citarla cuando un entrevistador pregunta por alternativas de la biblioteca estándar.

Trate las máscaras de bits como banderas y permisos, porque eso es lo que son

Una máscara no es más que una forma compacta de decir "estas opciones están activadas"

Las preguntas de entrevista sobre máscaras de bits que involucran banderas y permisos ponen a prueba si entiende un estado empaquetado en un solo entero. Los permisos de archivos de Unix son el ejemplo clásico: lectura, escritura y ejecución almacenados como tres bits. Esto no es un truco; es un patrón de diseño legítimo que aparece en código de sistemas, programación embebida y cualquier situación en la que importan la memoria o el ancho de banda en la comunicación.

A los entrevistadores les gusta este patrón porque revela si el candidato puede pensar en bits como estado significativo, no solo como aritmética.

Cómo se ve esto en la práctica

Cada constante es una máscara con exactamente un bit activado. Combinar varias con OR construye un conjunto de permisos. Probar con AND comprueba un bit específico. Eliminar con `& ~mask` lo borra. Este es el mismo patrón de establecer/borrar/alternar de la sección 4, aplicado a un dominio real. Reconocer esa conexión en la entrevista es lo que merece la etiqueta de "señal fuerte".

Sepa cuándo los desplazamientos ayudan — y cuándo Java cambia silenciosamente el significado

El desplazamiento a la izquierda suele ser multiplicar por dos, hasta que aparece el desbordamiento

Los operadores de desplazamiento de Java hacen que `n << k` sea equivalente a multiplicar `n` por `2^k`, siempre que el resultado quepa en el rango con signo de 32 bits. `8 << 1` es 16. `1 << 30` es 1.073.741.824. `1 << 31` es -2.147.483.648 porque establece el bit de signo. El modelo mental de "desplazar a la izquierda equivale a multiplicar por dos" es correcto hasta que el valor entra en territorio de desbordamiento con signo, y los entrevistadores que cuidan los casos límite lo llevarán ahí.

El desplazamiento a la derecha tiene dos versiones en Java, y eso importa para los negativos

Esta es la distinción de desplazamiento más preguntada en una entrevista técnica de Java:

  • `>>` (desplazamiento aritmético a la derecha): conserva el bit de signo. Desplazar un número negativo a la derecha rellena los bits altos vacíos con 1. `-8 >> 1` es -4.
  • `>>>` (desplazamiento lógico a la derecha): siempre rellena con 0 independientemente del signo. `-8 >>> 1` es 2.147.483.644 — un número positivo grande, porque el bit de signo se puso a cero.

Los candidatos que solo conocen `>>` tropiezan en cuanto aparece un número negativo. Los que conocen ambos pueden explicar por qué existe `>>>`: operaciones sin signo sobre tipos con signo, implementaciones de tablas hash y ciertos escenarios de empaquetado de bits.

Cómo se ve esto en la práctica

La simulación binaria para `-8 >> 1`: `-8` en complemento a dos es `11111111 11111111 11111111 11111000`. Desplácelo a la derecha 1 con extensión de signo: `11111111 11111111 11111111 11111100` → -4. Ahora `>>>`: desplácelo a la derecha 1, rellenando con 0: `01111111 11111111 11111111 11111100` → un número positivo grande. Ese resultado es el que el entrevistador espera que usted explique.

La sección de la Especificación del Lenguaje Java sobre operadores de desplazamiento es la fuente definitiva; declara explícitamente que `>>` es aritmético y `>>>` es lógico, que es la respuesta que debe dar cuando le pidan una justificación a nivel de especificación.

Preguntas frecuentes

P: ¿Cuáles son los operadores bit a bit de Java y en qué se diferencian de los operadores lógicos?

Los operadores bit a bit de Java — `&`, `|`, `^`, `~`, `<<`, `>>`, `>>>` — operan sobre bits individuales de valores enteros y siempre evalúan ambos operandos. Los operadores lógicos `&&` y `||` operan sobre valores booleanos y hacen cortocircuito: `&&` omite el operando derecho si el izquierdo es falso, `||` lo omite si el izquierdo es verdadero. Usar `&` cuando quería decir `&&` puede causar una `NullPointerException` porque el lado derecho siempre se evalúa, incluso cuando el lado izquierdo ya determinó el resultado.

P: ¿Cómo se comportan `&`, `|`, `^` y `~` sobre valores binarios en Java?

AND (`&`) devuelve 1 solo donde ambos bits son 1, útil para aislar bits específicos. OR (`|`) devuelve 1 donde al menos un bit es 1, útil para establecer bits. XOR (`^`) devuelve 1 donde los bits difieren, útil para alternar y cancelar. NOT (`~`) invierte todos los bits y, como Java usa complemento a dos, `~n` equivale a `-(n + 1)`, no a `-n`. Ejecutar los cuatro sobre el mismo par de entradas una vez es la forma más rápida de interiorizar la diferencia.

P: ¿Qué ocurre con los números negativos cuando usa `>>` y `>>>` en Java?

`>>` es desplazamiento aritmético a la derecha: copia el bit de signo en las posiciones vacantes, así que los números negativos siguen siendo negativos. `-8 >> 1` es `-4`. `>>>` es desplazamiento lógico a la derecha: siempre rellena con ceros, así que un número negativo se convierte en un entero positivo grande. `-8 >>> 1` produce 2.147.483.644. La distinción solo importa para números negativos; en valores no negativos, ambos operadores producen resultados idénticos.

P: ¿Cómo se relacionan el desplazamiento a la izquierda y a la derecha con multiplicar o dividir por potencias de dos, y dónde deja de funcionar?

`n << k` es equivalente a `n * 2^k` y `n >> k` es equivalente a `n / 2^k` (redondeando hacia menos infinito en negativos). El modelo falla en dos puntos: el desplazamiento a la izquierda provoca desbordamiento con signo cuando el resultado supera `Integer.MAX_VALUE`, y el desplazamiento a la derecha en números negativos redondea hacia menos infinito en lugar de hacia cero, lo que difiere de la división entera en Java. Conozca ambos casos límite antes de la entrevista.

P: ¿Cuáles son las preguntas de entrevista más comunes sobre operadores bit a bit en Java, como comprobar impar/par o alternar bits?

Los patrones recurrentes son: comprobación de paridad con `n & 1`, establecer/borrar/alternar un bit usando `1 << i` como máscara, contar bits activados con el bucle de Brian Kernighan `n & (n - 1)`, encontrar el único elemento no duplicado con un plegado XOR y distinguir `>>` de `>>>` en entradas negativas. Estos cinco patrones cubren la gran mayoría de las preguntas de manipulación de bits que aparecen en pruebas de programación Java. Si puede reconstruir cada uno desde cero con una simulación paso a paso, estará preparado.

P: ¿Cómo puede usar máscaras de bits para establecer, borrar o comprobar un bit específico en Java?

Construya la máscara con `1 << i` para apuntar a la posición de bit `i`. Establecer: `n | (1 << i)`. Borrar: `n & ~(1 << i)`. Alternar: `n ^ (1 << i)`. Comprobar: `(n & (1 << i)) != 0`. Ponga siempre paréntesis en `(1 << i)` de forma explícita: las reglas de precedencia de Java hacen que `1 << i & n` se evalúe como `1 << (i & n)`, que casi nunca es lo que desea.

P: ¿Qué errores cometen con más frecuencia los candidatos al explicar operadores bit a bit en entrevistas?

Tres errores aparecen una y otra vez. Primero, confundir `~n` con `-n`: el complemento a dos hace que `~n = -(n+1)`. Segundo, olvidar poner paréntesis en expresiones con desplazamientos e introducir errores silenciosos de precedencia. Tercero, tratar `>>` y `>>>` como si fueran intercambiables: son idénticos en números positivos, pero producen resultados totalmente distintos en negativos. Un cuarto error más sutil: nombrar el operador sin explicar la máscara ni simular los bits, lo que deja al entrevistador sin saber si el candidato realmente entiende el mecanismo.

Cómo puede ayudarle Verve AI a aprobar su entrevista de programación con operadores bit a bit

La parte más difícil de una prueba de programación con manipulación de bits no es el algoritmo, sino narrar su razonamiento en directo mientras ya está escribiendo código. Esa ejecución en doble canal es donde falla la preparación, y precisamente es la brecha que Verve AI Coding Copilot está diseñado para cerrar.

Verve AI Coding Copilot lee su pantalla en tiempo real — en LeetCode, HackerRank, CodeSignal y pruebas técnicas en vivo — y responde a lo que realmente aparece en su pantalla, no a un prompt genérico. Cuando está resolviendo un problema de "contar bits activados" y ha escrito el bucle ingenuo, Verve AI Coding Copilot puede sugerir la optimización de Brian Kernighan antes de que el entrevistador la pida. Cuando está repasando un caso límite de desplazamiento con signo y su modelo mental vacila, sugiere respuestas en vivo basadas en el código concreto que tiene delante. El modo Secondary Copilot mantiene un enfoque sostenido sobre un solo problema — sin cambiar de pestaña, sin perder contexto —, algo que importa cuando una pregunta sobre máscaras de bits se desarrolla a lo largo de cinco preguntas de seguimiento en la misma sesión. Y permanece invisible mientras hace todo esto, de modo que lo único visible para su entrevistador es usted resolviendo el problema.

Conclusión

Los operadores no son la parte difícil. `&`, `|`, `^`, `~`, `<<`, `>>`, `>>>` — puede memorizarlos en una tarde. Lo que lleva más tiempo, y lo que realmente determina cómo rinde en una prueba de programación, es el reconocimiento de patrones: ver "encuentre el único número" y recurrir de inmediato a XOR, ver un problema de máscaras y saber que debe construir `1 << i` antes de pensar qué operador aplicar.

Antes de su próxima prueba de programación, practique exactamente tres cosas desde cero: una comprobación de paridad con una simulación binaria paso a paso, una secuencia de establecer/borrar/alternar sobre un entero concreto con paréntesis explícitos, y una comparación de desplazamiento con signo entre `>>` y `>>>` sobre un número negativo. Escriba el Java, trace los bits y diga la complejidad en voz alta. Haga eso tres veces y los patrones dejarán de ser cosas que recuerda y pasarán a ser cosas a las que recurre automáticamente, que es la única forma de preparación que resiste bajo presión en vivo.

VA

Verve AI

Contenido