¿Por qué obtiene el bit único así?
Frecuentes
Visto 77 veces
0
Estoy buscando una parte del código que se supone que debe obtener un solo bit de un int.
Es como sigue:
private int getBit( int token, int pos){
return ( token & ( 1 << pos ) ) != 0 ? 1 : 0;
}
Mi pregunta es ¿por qué no lo hace de la siguiente manera (más simple)?
return token & ( 1 << pos );
Espero que también devuelva un 0
or 1
.
¿Estoy equivocado en esto? ¿La segunda versión (la mía) es incorrecta?
4 Respuestas
3
Su versión no devuelve el valor del bit en la posición pos. Devuelve el valor 0 o 2^(pos-1).
contestado el 22 de mayo de 12 a las 21:05
2
Tu versión es incorrecta. cuando ejecutas
return token & ( 1 << pos );
si no es cero, obtienes un int con cada bit excepto el pos
bit puesto a cero, porque ese es el número en el lado derecho de la &
operador. Esto obviamente solo sería 1 si pos==0
.
Esto sucede porque el &
El operador simplemente toma la operación bit a bit y entre los bits correspondientes en los dos int
s. Ya que 1 << pos
tiene un 1
bit en una posición además de la más baja y token
presumiblemente puede ser cualquiera int
, el resultado también puede tener un 1
bit en una posición distinta a la más baja, haciéndolo mayor que 1
.
contestado el 22 de mayo de 12 a las 21:05
Una forma alternativa que evita la rama pero funciona: return (token >>> pos) & 1
. - Luis Wassermann
Eso es cierto. Si desea cambiar menos del código existente, también puede hacerlo (token & ( 1 << pos )) && 1
. No mencioné esas cosas porque de eso no se trata la pregunta. - murgatroid99
2
Su versión devuelve 0 o 1<<pos
.
Eso no importará si se usa en contexto booleano. Pero podría ser de otra manera.
contestado el 22 de mayo de 12 a las 21:05
2
Por supuesto, puedes usar algo del orden de
(token >> pos) & 1
contestado el 22 de mayo de 12 a las 21:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java bit-manipulation bit or haz tu propia pregunta.
La segunda versión volverá
1 << pos
en caso de que el bit esté establecido, o0
de lo contrario. - Niklas B.