【问题标题】:Arithmetic Shift in PythonPython中的算术移位
【发布时间】:2020-07-02 17:55:38
【问题描述】:

我正在尝试编写一个程序,它将以算术方式将位移动到某个变量中。该程序适用于树莓派,将利用板载串行外设接口 SCLCK 功能来控制正在发送的位的速度,还将控制位的读取。换句话说,程序将在每个时钟周期运行一次的循环内。

然后,我们使用的模数转换器将根据以下内容以 MSB 样式发送位:8 位、中断位、8 位、中断位、8 位,总共 24 位数据正在发送.

然后程序将以相同的速度运行一个循环,以在准确的时钟周期读取位,然后在时钟周期获取我们正在输入的 GPIO 引脚的值,无论是真还是假,这将每 27 (24, + 3 个中断) 时钟周期继续无限循环。目标是为连接到模数转换器的麦克风的输出接收 24 位浮点数,该转换器将向输入端发送可变电压,进而产生 24 位浮点数。由于树莓派只支持串行接口,我一次只能接收一个比特,并且需要能够将它们放在一起以获得我需要的数字。

我想问是否有可用的方法,在 python 语言中,对变量进行算术移位,以便我可以发送从 GPIO 引脚接收到的位。我知道这可以在组装中完成,但我需要有关树莓派 GPIO 引脚地址的所有信息。这还包括针对特定应用的广泛网络。

关于如何实现这一点的任何想法?

if GPIO.input(25): #If it is true 
    #Arithmetic Logic Shift Left a one 
else: 
    #Arithmetic Logic Shift Left a zero –

【问题讨论】:

  • 欢迎来到 SO!如果你有一个 0b 号码,你可以使用int(binary) 或者如果你有一个字符串,你可以使用int(binary_string, 2) 吗? GPIO 在 Python 中为您提供什么格式的数据?
  • 数据将被表示为“0”或“1”,直到它被改变。我需要能够算术左移变量并添加引脚的当前值。然后我需要能够将该数字转换为整数。
  • "0""1" 看起来像字符串。将它们全部连接起来并调用int(binary_string, 2) 似乎就足够了。
  • 不是字符串,我只是在强调。它是一或零,开或关。
  • 这似乎是您的第一个问题。请不要低估以书面形式向不认识您、您的项目、您以前的经验和任何其他背景的人解释问题是多么复杂。 Stack Overflow 是一个很棒的地方,如果你的问题表达得足够好,你可以获得很好的答案。不要气馁。写好问题很难,但你会得到好的答案。

标签: python binary decimal bit-shift gpio


【解决方案1】:

问题不是 100% 清楚。所以我只是解释一下一般原理。

你要找的是算术左移运算符<<

new_bit = 1 if GPIO.input(25) else 0  # ensure new_bit is 1 or 0
result = result << 1 + new_bit # shift result left and add new bit as LSB

在您处理 24 个时钟周期之前,result 将被初始化为 result = 0

假设 python 没有左移操作符。 算术左移与乘以 2 相同。 所以你也可以这样写:

new_bit = 1 if GPIO.input(25) else 0  # ensure new_bit is 1 or 0
result = result * 2 + new_bit # shift result left and add new bit as LSB

你不是很清楚你想如何从 GPIO 接收数据。 (如何检测 SCLK 的变化/如何“以相同的速度运行循环以在准确的时钟周期读取位”)

我假设,您想通过一些 GPIO 访问一次读取一位,然后将这些位组合成一个整数。 但你可能会解释如何知道何时从 GPIO 读取下一位。

def get_bit():
    # some magic code
    value =  GPIO.input(25)
    # let's assume value is 1 or 0:
    bit = 1 if value else 0
    return bit

def get_24_bit_value():
    result = 0
    for _i in range(3):
        for _j in range(8):
            wait_for_clock_tick()  # to be implemeted by you
            result = (result << 1) + get_bit()
        wait_for_break()  # to be implemeted by you
    return result

【讨论】:

  • 稍微调整了我的回答
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多