里面的/256和%256有什么用,地址是怎么分成hi和lo位的?

问题描述 投票:0回答:4

这是来自

lib_robotis
的代码片段,值
n
是我们输入的角度(旋转dimexel电机)。

根据电机内部芯片的架构,我们要求将目标位置的低位(

lo
标识)放入地址0x1e中,将目标位置的高位(
hi
标识)放入地址0x1e中。地址0x1f。

def move_to_encoder(self,n);
    n=min(max(n,0),self.settings['max_encoder'])
    hi,lo=n/256, n%256
    return self.write_address(0x1e, [hi,lo])
python microcontroller
4个回答
2
投票

n 是 0 范围内的数字 <= n < 256*256. It takes two bytes to express that number since one byte can encode a value from 0 to 255.

hi,lo=n/256, n%256

相同
hi = n / 256
lo = n % 256

/
是除法运算符,
%
是余数运算符,因此上面的代码表示将
n
除以256并将商存储在
hi
中,将余数存储在
lo
中。
hi
lo
中的每一个都在 0 到 255 的范围内,因此它们各自适合一个字节。并且 n == (256 * hi) + lo,因此没有丢失任何信息,并且电机控制器拥有执行所需操作所需的所有信息。

我假设您帖子中的代码是为 Python 2 编写的;它在 Python 3 上无法正常工作。您应该将

n / 256
替换为
n // 256
以使代码在所有版本的 Python 上都能工作。

FWIW,有多种更好的方法可以将数字分解为高字节和低字节。一种使用内置的 divmod 函数:

hi, lo = divmod(n, 256)


2
投票

首先,您谈论的是更高/更低的字节,而不是

除以256相当于右移8次,所以基本上会得到高字节。将余数除以 256(通过 模运算符 '%')有效地提取低字节,因为结果将是 < 256 by definition.


2
投票

我们需要将目标位置的低位(由lo标识)放入地址0x1e

256 是 28,因此除以 256 意味着右移除以 8 位,得到高位字节

以16位数字为例:

1100101100101101
↑↑↑↑↑↑↑↑

除以 256 右移 8 位,将得到:

0000000011001011
        ↑↑↑↑↑↑↑↑

除以 256 的余数给出较低的字节


1
投票

将位视为二进制表示法中的“数字”。例如,如果您需要取数字 256 的最右边 2 位数字,则只需写 256%100,其中 100 是 10^2。同样,要取最右边的 8 个“二进制数字”(即位),您必须将该数字除以 2^8,即 256。

© www.soinside.com 2019 - 2024. All rights reserved.