我有一个字节数组(byte [16]),每个单元格中有一个字节:
0000000000010010 -> [0][0] ..... [1][0][0][1][0].
如何使用基数2逻辑得到结果?
我想得到结果:18
。我用C#。
答案 0 :(得分:4)
假设您的字节数组纯粹是0
s和1
s),应该能够使用以下内容(尽管如果是这种情况,bool[]
会{可能是一个更好的选择),最重要的位是第0个元素。
private int BytesToInt(byte[] byteArray)
{
// Start with zero
int result = 0;
foreach (var b in byteArray)
{
// For each item in the array, first left-shift the result one bit
result <<= 1;
// If the byte is non-zero, set the lowest bit in the result
if (b != 0) result |= 1;
}
return result;
}
答案 1 :(得分:-1)
你应该有点蠢蠢欲动。一个LINQ单行:
public static ushort ToUShort( this byte[] buffer )
{
const int ushort_bits = sizeof(ushort) * 8 ;
int bits = ushort_bits - 1 ;
return (ushort) buffer
.Take( ushort_bits )
.Select( b => b != 0 ? 1 : 0 )
.Aggregate(0 , (acc,b) => acc | (b<<(bits--)))
;
}
或同样简洁(可能更快):
public static ushort ToUShort( this byte[] buffer )
{
uint acc = 0 ;
int bits = sizeof(ushort) * 8 - 1 ;
int max = sizeof(ushort) * 8 ;
for ( int i = 0 ; i < max ; ++i )
{
acc |= (buffer[i]==0?0u:1u)<<(bits--) ;
}
return (ushort) acc ;
}