从bin值读取位

时间:2020-08-11 08:15:02

标签: c++ c memory bit

从bin值读取位的顺序是什么?拥有例如关于lParam消息的WM_CHAR的{​​{3}}网站,他们解释了哪些位具有什么含义。我应该从扫描代码值获取 16-23 位,还是应该从右向左读取位,反之亦然?

2 个答案:

答案 0 :(得分:2)

您链接到的页面使用LSB 0 bit numbering,因此您可以使用以下方式提取16-23位:

lParam & 0b00000000111111110000000000000000U
//         |       |      |               |
// bit    31      23     16               0
//        MSB                            LSB

注意:二进制数的0b前缀需要C ++ 14。在C语言中,它仅在某些实现中可用作扩展。

您可能还希望将结果向下移

(lParam & 0b00000000111111110000000000000000U) >> 16U

或更简单

(lParam >> 16U) & 0b11111111U //  or  (lParam >> 16U) & 0xFFU

答案 1 :(得分:1)

两种方式:

Salary=db.query("select * from Salary")
bySal=["?<=1000" ,"?>1000 && ?<=5000","?>=5000"]
bySalGroup=sales.enum(bySal,SalGroup)
result=bySalGroup.new(bySal(#):bySal,SalGroup.select(~.age<28).count():Age_28,SalGroup.select(~.age<38).count():Age_38,SalGroup.select(~.age<48).count():Age_48)

以及提取位的用法:

UINT bitsxtractBits(UINT val, int startBit, int nbits)
{
    UINT mask = ((UINT)1 << nbits) - 1;

    return (val & mask) >> startBit;
}

//note it will not work if you want to extract all bits (in this case 32). 
//but in this case you do not need to extract them :)

bitsxtractBits(message, 16, 8)