工作日志
Loctek
-
2025/1/13 寻找除法的位运算方法,来尝试减少运算时间
举个简单的例子,比如15(0b1111) / 3(0b0011) = 5(0b0101)。
即 5*3 = 15 ,(2^3 * 0 + 2^2 * 1 + 2^1 * 0 +2^0 * 1) * 3 = 15
那么可以制作一个这样的数组。依次是[(3 * 2^3), (3 * 2^2), (3 * 2^1), (3 * 2^0)],而这个数组并不需要真的用乘法算。
只需要将被除数左移即可,即[(3 << 3), (3 << 2), (3 << 1), (3 << 0)],我们知道计算机中,位移运算的速度是很快的。
def divide(self, dividend: int, divisor: int) -> int: # 判断是否同号 flag = (dividend > 0 and divisor > 0) or (dividend < 0 and divisor < 0) ret = 0 # 全部过程使用正数处理,根据flag返回结果的符号 dividend, divisor = abs(dividend), abs(divisor) # 预处理二进制数组 binary = [0 for _ in range(33)] # 第0位即2的零次方乘上除数,所以就是除数本身 binary[0] = divisor for i in range(1, 33): # 后面每一位是前面一位的两倍,因为二进制 # << 是位运算左移操作,等价于*2,但是速度更快 binary[i] = binary[i-1] << 1 for i in range(32, -1, -1): if binary[i] <= dividend: dividend -= binary[i] # 答案加上2^i ret += (1 << i) return min(ret, (1 << 31) - 1) if flag else -ret -
2025/2/26 不用改别人的shit山了,终于自己写项目代码,开始使用APL-FML-HDL分层软件架构
-
2025/4/2 我在工程项目中使用了循环队列,用于消息数据缓存,和中断实现驱动芯片时序,很有成就感
-
2025/5/2 完成了cortexM3和M0的boot与app跳转