¿Por qué obtiene el bit único así?

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?

preguntado el 22 de mayo de 12 a las 21:05

La segunda versión volverá 1 << pos en caso de que el bit esté establecido, o 0 de lo contrario. -

4 Respuestas

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

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 ints. 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

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

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 or haz tu propia pregunta.