首页 > 解决方案 > Python中的算术移位

问题描述

我正在尝试编写一个程序,该程序将以算术方式将位移入某个变量。该程序适用于树莓派,将利用板载串行外设接口 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 –

标签: pythonbinarydecimalbit-shiftgpio

解决方案


问题不是 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

resultresult = 0在您处理 24 个时钟周期之前会被初始化。

让我们假设 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


推荐阅读