如何在 C# 中提取字节的第 5 位

how do I extract the 5th bit of a byte in c#

如果我有十进制12,它的二进制表示是00001100。如何提取 fifth 位,在本例中为 1?我尝试 左移 4AND-ing 1 但这是 不正确的 。有人可以告诉我我做错了什么吗?

player = low << 4 & 1;

您需要将变量 1 和 & 左移。

player = (1 << 4) & low;

这将为您提供带尾随零的第 5 个二进制数字。

player = ((1 << 4) & low) >> 4;

这给出了精确的第 5 个二进制数字,删除了尾随零。

你其实是想获得3d位(从右端开始):

 00001100
     ^
     3d from the right end (bits are zero based)

你所要做的就是在>>的帮助下去掉3低位(100)并检查下一位:

 // 1 if 3d bit is set, 0 otherwise
 player = (low >> 3) & 1;

或者如果你有数字 5 - 来自 左端 的索引并假设 lowbyte:

 player = (low >> (sizeof(byte) * 8 - 5)) & 1;

您可以简单地使用按位与,而不是移位。正如其他人所说,您正在查看从右边开始的第 3 位(从零开始),换句话说,就是代表 2^3 的位。

player = (low & 8) / 8;

更通用的解决方案是

private int GetBit(int number, int bit) => (number & (1 << bit)) / (1 << bit);

注意:这确实需要将您的 decimal 转换为 int,因为 & 不适用于 decimal