2011-11-27 14 views
5

No sé cómo llamarlo, lo que hace que Google sea más difícil.Entero a byte con un número dado de bits establecidos

tengo un entero, dicen 3, y quieren convertirlo en 11100000, es decir, un byte con el valor del número de bits puestos enteros, desde la más significativa bits.

que supongo que se podría hacer con:

byte result = 0; 
for(int i = 8; i > 8 - 3; i--) 
    result += 2^i; 

pero ¿hay algo más rápido/más agradable o, preferiblemente, la biblioteca estándar incluido en .net?

+0

¿Qué pasa si su número entero es mayor que 8? –

+6

Solo un pequeño punto^es un operador exclusivo o en C#, no el operador de energía. –

+0

@Martin Haha gracias, me tomó unos segundos justo ahora para darme cuenta. Fácil de olvidar a veces, si también escribe ecuaciones para un papel mientras programa. – Max

Respuesta

11
int n = 3; // 0..8 
int mask = 0xFF00; 
byte result = (byte) (mask >> n); 
+0

+1, muy agradable. ¿Es el elenco estrictamente necesario? – Cameron

+0

¿qué hay de n> 8? –

+0

@ Cameron, sí lo es, ya que el resultado de 'mask >> n' es del tipo' int' –

5

Debido a que sólo hay unas pocas posibilidades, que sólo podría almacenar en caché ellos:

// Each index adds another bit from the left, e.g. resultCache[3] == 11100000. 
byte[] resultCache = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0XF8, 0xFC, 0xFE, 0xFF }; 

También se obtendría una excepción en lugar de un error de silencio si accidentalmente se trató de obtener el valor para n > 8.

+0

+1 premio de consolación por señalar un enfoque simple y efectivo para muchos de estos tipos de problemas (búsqueda de tablas) que se pasa por alto fácilmente y que todos los programadores deberían tener en su caja de trucos. (En este caso, no es una solución tan buena como la de Henk) –

+0

@JasonWilliams Gracias. Elegí la solución elegante de Henk antes de publicar esta alternativa :-). –

Cuestiones relacionadas