我对按位运算符有一个非常基本的了解。然而,我无法理解如何分配价值。如果有人能指出我正确的方向,我将非常感激。
我的十六进制地址:0xE0074000
十进制值:3758571520
二进制值:11100000000001110100000000000000
我正在尝试编写一个简单的微控制器并使用Microsoft .Net Micro Framework中的Register访问类来使Controller完成我想要的操作。
Register T2IR = new Register(0xE0074000);
T2IR.Write(1 << 22);
在上面的例子中,二进制表示中的位如何移动?我不明白如何以二进制形式将位管理分配给地址。
如果有人能指出我正确的方向,我会非常感激。
答案 0 :(得分:12)
忘记开始的小数。你稍后会回到那里。
首先,你需要看到HEX和BINARY之间的逻辑。
好的,对于一个字节,你有8位(#7-0)
#7 = 0x80 = %1000 0000
#6 = 0x40 = %0100 0000
#5 = 0x20 = %0010 0000
#4 = 0x10 = %0001 0000
#3 = 0x08 = %0000 1000
#2 = 0x04 = %0000 0100
#1 = 0x02 = %0000 0010
#0 = 0x01 = %0000 0001
当您以二进制形式读取时,以字节为单位,例如%00001000
然后位设置,是右边的第4位#3,其值为08十六进制(实际上也是十进制,但是当你计算出十六进制/二进制时仍然忘记了十进制)
现在,如果我们有二进制数%10000000 这是#7位开启。它的十六进制值为0x80
所以你要做的就是在“半字节”中总结它们(十六进制字节的每个部分被一些极客称为半字节)
半字节中的最大值是(十进制)15或F为0x10 + 0x20 + 0x40 + 0x80 = 0xF0 =二进制%11110000
所以所有灯都打开(4位)半字节= F十六进制(十进制15)
同样适用于较低的半字节。
你看到了模式吗?
答案 1 :(得分:4)
请参阅@ BerggreenDK关于转变的答案。这里有一些关于它在十六进制中的含义的信息(同样的,只是不同的表示):
移位是一个非常简单的概念。寄存器具有固定的大小,并且任何不适合的位都会丢失。所以,举个例子:
int num = 0xffff << 16;
您的十六进制变量现在为0xffff0000
。注意右端是如何用零填充的。现在,让我们再次改变它。
num = num << 8;
num = num >> 8;
num
现在是0x00ff0000
。你没有得到你的旧位。这同样适用于右移。
技巧:向左移动1就像将数字乘以2一样,右移1就像将整数除以2一样。