python - 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 –
解决方案
问题不是 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
result
result = 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
推荐阅读
- r - 使用 ggplot 绘制多个条形图
- mysql - Mysql8 xdevapi node.js CRUD table.select问题
- tsql - 将括号拆分为列 - SSMS
- intellij-idea - Clojure 和 Groovy 集成问题:依赖关系
- angularjs - 如何使用自定义编译指令进行 $compile
- python - 在函数中使用 lambda
- php - 当短代码中有短代码时,将 do_shortcode() 替换为直接函数
- c++ - C++ 在避免内存泄漏方面是否比 C 更好?
- c - 如何在下一次递归调用中从二维数组中的下一列\行开始?(C)
- css - 图标在不同设备上的视口和像素密度变得模糊