如何在 C# 中提取字节的第 5 位
how do I extract the 5th bit of a byte in c#
如果我有十进制12
,它的二进制表示是00001100
。如何提取 fifth 位,在本例中为 1
?我尝试 左移 4
和 AND
-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
- 来自 左端 的索引并假设 low
是 byte
:
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
。
如果我有十进制12
,它的二进制表示是00001100
。如何提取 fifth 位,在本例中为 1
?我尝试 左移 4
和 AND
-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
- 来自 左端 的索引并假设 low
是 byte
:
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
。