如何在C#中对字节进行零位(nyble)呢?

如何在C#中对字节进行零位(nyble)呢?,c#,.net,byte,C#,.net,Byte,我希望学习如何使用C#从一个字节中获取两个半字节(高和低),以及如何将两个半字节组装回一个字节 我正在使用C#和.Net 4.0,如果这有助于实现哪些方法以及哪些库可用的话。您可以“屏蔽”字节的4位以获得半字节,然后将这些位移到字节中最右边的位置: byte x = 0xA7; // For example... byte nibble1 = (byte) (x & 0x0F); byte nibble2 = (byte)((x & 0xF0) >> 4); //

我希望学习如何使用C#从一个字节中获取两个半字节(高和低),以及如何将两个半字节组装回一个字节


我正在使用C#和.Net 4.0,如果这有助于实现哪些方法以及哪些库可用的话。

您可以“屏蔽”字节的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);
字节x=0xA7;//例如
字节nibble1=(字节)(x&0x0F);
字节nibble2=(字节)((x&0xF0)>>4);
//或者。。。
半字节2=(字节)((x>>4)和0x0F);

byte original=(byte)((nibble2我假设您可以执行一些位操作

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.

此扩展符合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);
}
//
///从大量数据中提取一个小点。
/// 
///任何整数类型。
///要从中提取半字节的值。
///一点一点地检查,
///其中0是最低有效半字节。
///提取的小口。
公共静态字节GetNibble(这个T,int nibblePos)
其中T:struct,IConvertible
{
nibblePos*=4;
var值=t.ToInt64(CultureInfo.CurrentCulture);
返回(字节)((值>>nibblePos)和0xF);
}

没有一个答案令人满意,因此我将提交我自己的答案。 我对这个问题的解释是:
输入: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

如果OP想要屏蔽并转换为4位值(通常情况下是4位值),此解决方案非常有效。更简单:
(value>>nibblePos)&0x0F
如果断言为非真,这意味着什么?@krvl这意味着存在某种错误。如果断言为假,则意味着高半字节与低半字节的组合不等于原始字节。如果是这种情况,则计算中会出现某种错误。