我有一个包含10个值(字节,十六进制)的列表。该列表将转换为十进制:


  09 04 5A 14 4F 7D





  9 4 90 20 79 125


之后。有一种方法(参数:List<Byte> byteList)。任何人都可以用该方法向我解释以下代码:

"Test:" + ((((UInt16)byteList[(Int32)index] & 0x40) << 1) >> 7):


特别是& 0x40<< 1>> 7

最佳答案

0x40是十六进制40-十进制又名64,或二进制为01000000。 &是按位“与”,因此{expr} & 0x40的意思是“仅取第7位”。 <<是左移,而>>是右移。所以这:


需要第七位
左移1
右移7
将第7位保留在LSB位置,因此最终值将为0(如果未设置第7位)或1(如果设置了第7位)


坦白说,将>> 6或与0比较会更容易。同样,强制转换为shortUInt16)在这里没有用。

如果我想测试第7位,我会做:

bool isSet = (byteList[(int)index] & 0x40) != 0;

09-30 08:49