跳转至

工作日志

Loctek

  • 2025/1/13 寻找除法的位运算方法,来尝试减少运算时间

    位运算实现加、减、乘、除

    LeetCode29 Medium 不用除号实现除法

    举个简单的例子,比如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跳转