2010-06-26 14 views

Odpowiedz

27

Można „maskę” 4 bity bajtu mieć kęs, a następnie przenieść te bity do pozycji skrajnej prawej w bajcie:

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

to rozwiązanie działa bardzo dobrze jeśli th e OP chce maskować i konwertować na czysto 4-bitowe wartości, co często ma miejsce. – Firoso

0

Przypuszczam można zrobić kilka bitowe operacje

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

Co to znaczy, że twierdzenie nie jest prawdziwe? – krvl

+0

@krvl oznacza, że ​​wystąpił jakiś błąd. Jeśli to stwierdzenie jest fałszywe, oznacza to, że wysoki posmak w połączeniu z niskim posuwem nie jest równy oryginalnemu bajtowi. W takim przypadku wystąpiłby pewien błąd w obliczeniach. – ProgramFast

2

to rozszerzenie ma co OP wymagane, pomyślałem, dlaczego nie podzielić się nim:

/// <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

Prostsze: '(wartość >> nibblePos) & 0x0F' –

+0

@BenVoigt, masz rację. Zaktualizowano. Dzięki. – Shimmy

Powiązane problemy