如何按位操作十六进制值?

Posted

技术标签:

【中文标题】如何按位操作十六进制值?【英文标题】:How is a Hex Value manipulated bitwise? 【发布时间】:2012-06-13 22:19:03 【问题描述】:

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

我的十六进制地址:0xE0074000

十进制值:3758571520

二进制值:11100000000001110100000000000000

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

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

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

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

【问题讨论】:

【参考方案1】:

一开始就忘记小数。稍后您会谈到这一点。

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

下半字节也是如此。

你看到模式了吗?

【讨论】:

是的,我知道这部分是如何工作的,感谢您的出色解释!因此,如果我们的值为 000011001000 并且我们执行此操作 (8 如果我们有一个 32 位长的二进制 1 和 0 数组,并且我们想将第 8 位移动 1,我们可以只修改一个值吗?例如:bin[7] = 1; ?? 更进一步,如果我们想这样做 (8 我们如何编码:unit myBin = 000111001000; myBin = (8 我想我知道这种混乱来自哪里。在数据表中,它谈到了在寄存器中设置位(这并不是真正的位移)这是位微型化!正如我上面解释的那样,位移将改变整个二进制地址。有些类可以单独更改每个位,同时仍使用位移位技术。它在类中进行了更改!不在 Bitshifting 中...【参考方案2】:

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

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

int num = 0xffff &lt;&lt; 16;

您的十六进制变量现在将是0xffff0000。注意右端是如何用零填充的。现在,让我们再换一次。

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

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

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

【讨论】:

问题不在于位运算符。问题在于类以及类如何将信息分配给寄存器地址。所以在这种情况下:Register.SetBits((3 URL 链接:Register Class Documentation 文档链接。它很简短,没有给我答案。 好的,一个 Eureka Moment,在寄存器中设置掩码中值为 1 的位。掩码中值为 0 的位不会更改。所以我们需要先计算出要设置的二进制值,然后再将值分配给寄存器。所以如果我们想在括号中设置 0010011(0)11 那么我们需要解析一个二进制 0100 来设置这个 BIT!呜呜呜终于! 很高兴您找到了答案。请标记正确的问题,以便其他人可以阅读此问题并快速找到它。 :o) + 正确答案的作者也获得了一点声望奖励。 请记住,根据您是要设置位还是清除位,您需要使用正确的运算符:OR 设置位,AND 清除位,XOR 切换位。

以上是关于如何按位操作十六进制值?的主要内容,如果未能解决你的问题,请参考以下文章

操作符详解

C# 逻辑位运符及运算原理 按位操作二进制

C# 逻辑位运符及运算原理 按位操作二进制

C# 逻辑位运符及运算原理 按位操作二进制

ActionScript 3 AS3使用按位运算符将十六进制值转换为RGB

一个数与0进行按位或,能取整