这是来自lib_robotis
的代码片段,n
的值是我们输入的角度(旋转dimexel电机)。
根据电机内芯片的架构,我们需要将目标位置的较低位(由lo
标识)放入地址0x1e,将目标位置的较高位(由hi
标识)放入地址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])
是 0 <= n <256*256 范围内的数字。表示该数字需要两个字节,因为一个字节可以编码从 0 到 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)
首先,您谈论的是更高/更低的字节,而不是位。
除以 256 与向右移动 8 次相同,因此基本上会产生高字节。将除法的余数除以 256(通过模运算符 '%')有效地提取较低的字节,因为根据定义,结果将<256。
256我们需要将目标位置的较低位(由 LO 标识)放入地址0x1e
是 2 8,所以除以 256 意味着右移8 位,给你高字节。
以一个 16 位数字为例:
1100101100101101
↑↑↑↑↑↑↑↑
将其除以 256 是右移 8 位,将得到:
0000000011001011
↑↑↑↑↑↑↑↑
除以 256 的余数为您提供较低的字节。
位想象成二进制表示法中的"数字"。如果你需要取数字 256 最右边的 2 位数字,你只需写 256%100,其中 100 是 10^2。同样,要取 8 个最右边的"二进制数字",即位,您必须将数字除以 2^8,即 256。