2010-04-18 26 views
5

He estado tratando de resolver este problema por un tiempo, pero no pude con números enteros aritméticos y operadores bit a bit. Sin embargo, creo que es posible y debería ser bastante fácil. ¿Qué me estoy perdiendo?¿La forma más rápida de calcular una máscara de bits X-bit?

El problema: para obtener un valor entero de longitud arbitraria (esto no es relevante para el problema) con su X bits menos significativos sets a 1 y el resto a 0. Por ejemplo, dado el número 31, I necesita obtener un valor entero que sea igual a 0x7FFFFFFF (31 bits menos significativos son 1 y el resto ceros).

Por supuesto, utilizando un bucle OR-ing un desplazado 1 a un número entero X veces hará el trabajo. Pero esa no es la solución que estoy buscando. Debería ser más en la dirección de (X << Y - 1), sin usar bucles.

Respuesta

6

Prueba esto: (1 < < X) - 1

+0

No debería, siempre y cuando arroje 1 primero (no sé C#, así que no sé cómo). Luego se evaluará a 0 - 1, es decir, 32 1 en una máquina de 32 bits. – doublep

+0

Usted tiene la solución que estaba buscando. Directo y simple, sin ningún bucle. Y cuando X es igual a la longitud del bit del entero, todos los bits se convierten en 1 como se esperaba. Incluso funciona para la esquina donde X = 0. Gracias. – Virtlink

0

creo que el siguiente debería funcionar:

int mask = (int)Math.Pow(2, 31) - 1; 

Esta es una sola expresión matemática, pero no es especialmente eficaz porque el cálculo de la potencia de esta manera no es realmente una buena idea. Sin embargo, ya que estamos calculando una potencia de 2, podemos hacer lo mismo usando turno:

int mask = (1 << 31) - 1; 
+0

La participación de números de punto flotante y una conversión a 'int' probablemente no califica como" más rápido "... – Joey

+0

Sí, me di cuenta de cómo corregir eso justo después de publicar la versión inicial, pero mientras tanto, @doublep ya publicado esa solución. Creo que voy a dejar mi versión aquí, ya que explica el proceso de pensamiento que me llevó allí :-). –

2

Prueba esto:

uint.MaxValue >> (32 - something) 
Cuestiones relacionadas