这可能是您正在寻找的:
Register_B = Register_A & 0x003F; // Take the 6 LSB (bits 0-5)
Register_C = Register_A & 0x07C0; // Take the bits 6-10
Register_C = (Register_A & 0x07C0) >> 6; // Or maybe you want to place these bits elsewhere using bit shift?
这是关于在 C 中使用位的更多说明。主要用于微控制器,但在 Windows 中也可以使用完全相同的内容,除非您不直接在 Windows 中使用寄存器。
十进制 5 = 二进制 0000 0101 = 十六进制 0x05 十进制 16 = 十六进制 0x10
现在,这是一个二进制示例:
x = (5 << 1);
5 = 0000 0101
5 << 1 = 0000 1010 (Same sa 5, but bits are shifted left by 1)
5 << 2 = 0001 0100 (5 shifted by 2 bits to the left.)
最后,您还可以比较“MASK”位的位:此代码显示如何比较位。
x = 5;
if( x & 0x01)
{ .. code here is executed because at least 1 bit from "0x01" is present in "decimal 5"
}
- (variable & var2) 表示两个变量中至少有一位为“1”
- (Var1 | Var2) 表示两个变量中的任何一个都为真。
- (Var1 ^ Var2) 表示在一个变量中至少一位为“1”,在另一变量中为“0”。基本上,如果 Var1 与 Var2 不同,这将是正确的。
您还可以屏蔽位:
Var1 = 254; // All 8 bits are "1" except the least significant bit which is 0.
Var2 = Var1 & 0x0F; // 0x0F = only last 4 bits "1".
在这种情况下, Var2 会以0000 1110because结束1111 1110 & 0000 1111。对于 Var2,两个值中为“1”的所有位都将变为“1”,但所有其他位将为 0。这是按位与运算,其中结果的每一位仅取决于输入的相应位。
我知道你在 Windows 中并不需要这个,但是编程微芯片意味着直接玩很多位。
再次关于寄存器......只需将它们视为普通变量,但微控制器一直在读取和写入它们,因此在那里写入值可能会产生影响,例如闪烁 LED 或在 USART/ COM 端口上发送字节. 阅读数据表甚至会告诉你一些寄存器是只读的还是只写的,通常会详细解释寄存器的作用。如果您对PIC或AVR等 MCU 进行编程,则需要了解数据表。它们是您最有价值的工具。