13

我对按位运算符有一个非常基本的了解。但是,我不知道如何分配值。如果有人能指出我正确的方向,我将不胜感激。

我的十六进制地址:0xE0074000

十进制值:3758571520

二进制值:11100000000001110100000000000000

我正在尝试编写一个简单的微控制器并使用 Microsoft .Net 微框架中的注册访问类来使控制器做我想做的事情。

Register T2IR = new Register(0xE0074000);
T2IR.Write(1 << 22);

在我上面的例子中,二进制表示中的位是如何移动的?我不明白如何将位管理分配给二进制形式的地址。

如果有人能指出我正确的方向,我会非常满意。

4

2 回答 2

17

一开始就忘记小数。你稍后会回到那个。

首先你需要看看 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位)

下半字节也是如此。

你看到图案了吗?

于 2012-06-10T22:39:14.950 回答
7

请参阅@BerggreenDK 的回答,了解什么是转变。这里有一些关于十六进制的信息(同样的东西,只是不同的表示):

换档是一个很容易理解的概念。寄存器的大小是固定的,任何不适合的位都会从末尾掉下来。所以,举个例子:

int num = 0xffff << 16;

你的十六进制变量现在是0xffff0000. 注意右端是如何用零填充的。现在,让我们再次转移它。

num = num << 8;
num = num >> 8;

num现在是0x00ff0000。你不会拿回你的旧东西。这同样适用于右移。

技巧:左移 1 就像将数字乘以 2,右移 1 就像整数除以 2。

于 2012-06-10T23:50:36.753 回答