2010-06-26 11 views
17

Estoy buscando aprender cómo obtener dos mordiscos (alto y bajo) de un byte usando C# y cómo ensamblar dos mordiscos de nuevo en un byte.¿Cómo se pueden picar (nybble) bytes en C#?

Estoy usando C# y .Net 4.0 si eso ayuda con qué métodos se pueden hacer y qué bibliotecas pueden estar disponibles.

Respuesta

27

Puede 'enmascarar' 4 bits de un byte para tener un mordisco, a continuación, cambiar los bits a la posición más a la derecha en el byte:

byte x = 0xA7; // For example... 
byte nibble1 = (byte) (x & 0x0F); 
byte nibble2 = (byte)((x & 0xF0) >> 4); 
// Or alternatively... 
nibble2 = (byte)((x >> 4) & 0x0F); 
byte original = (byte)((nibble2 << 4) | nibble1); 
+0

esta solución funciona muy bien si º e OP quiere enmascarar y convertir a valores puramente de 4 bits, que a menudo es el caso. – Firoso

0

yo supongo que podría hacer algunas operaciones bit a bit

byte nib = 163; //the byte to split 
byte niblow = nib & 15; //bitwise AND of nib and 0000 1111 
byte nibhigh = nib & 240; //bitwise AND of nib and 1111 0000 
Assert.IsTrue(nib == (nibhigh | niblow)); //bitwise OR of nibhigh and niblow equals the original nib. 
+0

¿Qué significa si la afirmación no es verdadera? – krvl

+0

@krvl significa que hubo algún tipo de error. Si esa afirmación es falsa, significa que el nibble alto combinado con el nibble bajo no es igual al byte original. Si ese es el caso, entonces habría algún tipo de error en los cálculos. – ProgramFast

2

esta extensión hace lo que solicitó a la OP, pensé por qué no compartirlo:

/// <summary> 
/// Extracts a nibble from a large number. 
/// </summary> 
/// <typeparam name="T">Any integer type.</typeparam> 
/// <param name="t">The value to extract nibble from.</param> 
/// <param name="nibblePos">The nibble to check, 
/// where 0 is the least significant nibble.</param> 
/// <returns>The extracted nibble.</returns> 
public static byte GetNibble<T>(this T t, int nibblePos) 
where T : struct, IConvertible 
{ 
nibblePos *= 4; 
var value = t.ToInt64(CultureInfo.CurrentCulture); 
return (byte)((value >> nibblePos) & 0xF); 
} 
+1

Simpler: '(value >> nibblePos) & 0x0F' –

+0

@BenVoigt, tienes razón. Actualizado. Gracias. – Shimmy

Cuestiones relacionadas