这是来自
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])
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)
首先,您谈论的是更高/更低的字节,而不是位。
除以256相当于右移8次,所以基本上会得到高字节。将余数除以 256(通过 模运算符 '%')有效地提取低字节,因为结果将是 < 256 by definition.
我们需要将目标位置的低位(由lo标识)放入地址0x1e
256 是 28,因此除以 256 意味着右移除以 8 位,得到高位字节。
以16位数字为例:
1100101100101101
↑↑↑↑↑↑↑↑
除以 256 右移 8 位,将得到:
0000000011001011
↑↑↑↑↑↑↑↑
除以 256 的余数给出较低的字节。
将位视为二进制表示法中的“数字”。例如,如果您需要取数字 256 的最右边 2 位数字,则只需写 256%100,其中 100 是 10^2。同样,要取最右边的 8 个“二进制数字”(即位),您必须将该数字除以 2^8,即 256。