Как вы можете откусить (nybble) байтов в C #? - PullRequest
19 голосов
/ 26 июня 2010

Я хочу узнать, как получить два куска (высокий и низкий) из байта с помощью C # и как собрать два куска обратно в байт.

Я использую C # и .Net 4.0, если это помогает с тем, какие методы можно сделать и какие библиотеки могут быть доступны.

Ответы [ 4 ]

32 голосов
/ 26 июня 2010

Вы можете «замаскировать» 4 бита байта, чтобы получить откусывание, затем сдвинуть эти биты в крайнее правое положение байта:

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);
4 голосов
/ 19 мая 2013

Это расширение делает то, что запросил OP, я подумал, почему бы не поделиться им:

/// <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);
}
2 голосов
/ 25 апреля 2018

Ни один из ответов не был удовлетворительным, поэтому я представлю свой. Моя интерпретация вопроса была:
Вход: 1 байт (8 бит)
Вывод: 2 байта, каждый из которых хранит полубайт, что означает, что 4 крайних левых бита (или верхний полубайт) равны 0000, а 4 крайних правых бита (нижний полубайт) содержат отдельный полубайт.

byte x = 0x12; //hexadecimal notation for decimal 18 or binary 0001 0010
byte highNibble = (byte)(x >> 4 & 0xF); // = 0000 0001
byte lowNibble = (byte)(x & 0xF); // = 0000 0010
0 голосов
/ 26 июня 2010

Я бы предположил, что вы могли бы выполнять побитовые операции

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