我正在尝试学习如何在给定输入上使用按位运算符,但是没有太多运气弄清楚如何使用它们。
假设我有以下八位字节:
11(01)0000
如何在大括号之间提取位?
答案 0 :(得分:6)
你需要:
创建一个合适的掩码,只有你需要的字节在哪里(你只需要用二进制编写数字并转换成例如hex,将它放在C程序中)。 11(01)0000
中的括号表示将这些括号放在面具中。
或者,创建一个由您感兴趣的比特块组成的掩码(在您的情况下为两个,即二进制11
,即十进制的3
和左移它将它移动到你需要它的位置(左移操作符:<<
)。如果仅在运行时知道“位窗口”的位置,则此方法非常有用。
在您的号码和掩码之间执行按位和操作(按位和运算符为&
)。
按位并且只留下两个操作数中为1的位为1,因此效果是使用掩码的位“过滤”源编号:只有与掩码中的位相对应的位才“流过“它,所有其他位都保留为零。
现在您已经提取了您感兴趣的位,但它们仍然在数字内部的原始位置。如果你想要/需要它,你可以右移它们“将它们对齐”(使用右移操作符:>>
)。
答案 1 :(得分:1)
使用您要选择的位掩盖您的值,然后移位。
如果你的11010000号码是x,你想要的两位数是
(x & 0x30 ) >> 4