我有一些像这样的旧代码:
private int ParseByte(byte theByte)
{
byte[] bytes = new byte[1];
bytes[0] = theByte;
BitArray bits = new BitArray(bytes);
if (bits[0])
return 1;
else
return 0;
}
这很长,我想我可以这样修剪下来:
private int ParseByte(byte theByte)
{
return theByte >> 7;
}
但是,我没有得到与第一个函数相同的值。该字节包含00000000或10000000.我在这里缺少什么?我使用的是不正确的算子吗?
答案 0 :(得分:4)
问题在于,在第一个函数中,bits [0]返回最低有效位,但第二个函数返回最高有效位。要修改第二个函数以获得最低有效位:
private int ParseByte(byte theByte)
{
return theByte & 00000001;
}
要修改第一个函数以返回最高有效位,应使用位[7] - 而不是位[0]。
答案 1 :(得分:3)
第一个snipet的等效函数是:
return theByte & 1 == 1
在第二个snipet中,你是最有意义的位,而在第一个snipet中,它是最不重要的。
答案 2 :(得分:1)
你想返回int还是字符串?无论如何 - 你可以使用modulo:
return theByte % 2 == 0 ? "0" : "1"
好的,你编辑了......并希望返回int
转换操作的一句话:你必须使用<<而不是>>。但是这会返回(当你转换为byte而不是int时)0或128而不是0或1.所以你可以将第二个解决方案重写为:
return (byte)(theByte << 7) == 128 ? 1 : 0;
但其他答案包含的解决方案确实比这更好。
答案 3 :(得分:0)
也许第一个函数应检查位[7]?
答案 4 :(得分:0)
您的二进制数字中有一个额外的零(每个都有9位数字)。我假设这只是一个错字。
你确定你正确地订购了吗?二进制传统上是从右到左书写的,而不像大多数其他编号系统那样从左到右书写。如果您显示的二进制数字是属性格式的(意味着10000000
实际上是数字128
而不是数字1
),那么您的第一个代码段应该不起作用,第二个应该是。如果你向后写(意味着10000000
是1
,而不是128
),那么你甚至不需要比特移位。只需和它1(theByte & 1
)。
实际上,无论方法如何,按位AND(&
运算符)似乎更合适。鉴于你的第一个函数是有效的,而第二个函数没有,我假设你只是向后写了数字,并且如上所述需要将它与1进行对比。
答案 5 :(得分:0)
根据Microsoft's site上的用户,BitArray内部按位顺序将这些位存储为大端的Int32。这可能会导致问题。有关解决方案和更多信息,请访问该链接。
答案 6 :(得分:0)
1st第一个函数不起作用,因为它试图返回一个字符串而不是一个int。
但你可能想要的是:
private static int ParseByte(byte theByte)
{
return theByte & 1;
}
但是你可能也想要这个:
private static string ParseByteB(byte theByte)
{
return (theByte & 1).ToString();
}