杂项
发表于|更新于|rt-thread
杂项
检查是否否是2的幂
- 检查sz_blk是否是2的幂。原理如下:
如果一个数是2的幂,那么它的二进制表示中只有一个位是1,其余都是0。例如,2(10),4(100),8(1000)等。
当我们从这个数中减去1时,所有从最右边的1开始到最左边的所有位都会翻转。例如,4(100)减去1变成3(011)。
因此,如果一个数是2的幂,那么这个数与它自己减去1的结果进行位与运算,会得到0。因为没有位同时在两个数中都是1。
反之,如果一个数不是2的幂,那么它至少有一个位不是1,这样减去1之后,至少有一个位在两个数中都是1,位与运算的结果不为0。
这个技巧在编程中经常被用来快速检查一个数是否是2的幂,因为它比循环或递归方法更高效。
1 | #define IS_POWER_OF_TWO(x) (((x) & ((x) - 1)) == 0) |
文章作者: Liya Huang
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
相关推荐

2025-10-03
fatfs
fatfs[TOC] 硬盘的物理结构:概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。如下图: 图1 扇区 和 磁道下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图中绿色部分),对于老式磁盘,每个扇区存储容量是相同的(也就是每个磁道的容量是相同的,但不同磁道的数据密度是不同的,半径越小的磁道的密度越大,这个是怎么做到的,还不清楚,但我个人猜测是因为旋转角度,转动相同的角度,外部扇区移动的距离更长,而内部扇区移动距离短,就是通过磁头每次移动是固定角度的,但由于磁臂的长度不同,分别对应不同的磁道,那对于外围的扇区,由于磁臂较长,每次移动固定角度,则划过的...

2026-09-16
rt-thread学习笔记系列
rt-thread学习笔记系列 其他资料 1.1. fatfs 1.1.1. fatfs (个人博客链接) 2. ARM指针寄存器 (个人博客链接) 3. canopennode-rtt推荐,不只可以做从站,也可以承担主站角色 (个人博客链接) (CSDN链接) 4. CAN驱动 (个人博客链接) 5. completion (个人博客链接) 6. condvar (个人博客链接) 7. dataqueue (个人博客链接) 8. DFS (个人博客链接) 9. fal (个人博客链接) 10. fatfs (个人博客链接) 11. FINSH模块 (个人博客链接) 12. I2C驱动 (个人博客链接) 13. IDLE线程 (个人博客链接) 14. IPC (个人博客链接) 15. littlefs (个人博客链接) 16. map文件分析 (个人博客链接) 17. pipe (个人博客链接) 18. PM电源管理 (个人博客链接) 19. ringblock (个人博客链接) 20. ringbuffer (个人博客链接) 21. romfs (个人博客链接) ...

2026-09-16
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践 摘要:用 Submodule 锁定 RT-Thread 与第三方依赖版本,用 Sparse Checkout 精简工作区,并保持业务代码、构建配置和上游同步边界清晰。 @[toc]嵌入式固件项目维护时间一长,仓库很容易逐渐变成“一份大拷贝”:RTOS 内核、芯片厂商库、BSP、第三方组件和产品业务代码全部堆在一起。短期看最省事,长期却会暴露几个典型问题:依赖来源难追踪、升级时 diff 巨大、多个项目重复保存相同代码、业务代码和基础设施边界越来越模糊。 更适合长期维护的做法,不是简单把目录删掉或拆得越碎越好,而是把三个问题分别交给三个机制处理: Git Submodule:这个依赖来自哪个仓库,产品当前锁定哪个 commit; Git Sparse Checkout:一个已经存在的仓库,在当前工作区实际展开哪些目录; Kconfig / rtconfig.h / SCons / IDE 工程:哪些功能和源文件...

2026-09-01
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色 摘要:canopennode-rtt 将 CANopenNode 接入 RT-Thread,可同时承载设备与控制器角色;本文还对比 RTT-CanFestival 的架构、CiA 402、维护与选型差异。 仓库地址:https://github.com/wdfk-prog/canopennode-rtt在线文档:https://wdfk-prog.space/canopennode-rtt/上游协议栈:https://github.com/CANopenNode/CANopenNode本文基于 canopennode-rtt master 分支 2026-09-01 的公开状态整理,参考提交:b5a9dc1a242d784358ebc8a5bf81d5afcdc8f4ba。 @[toc] 如果你正在 RT-Thread 上做伺服驱动、运动控制器、工业 I/O、传感器节点、执行器、网关或者任何需要 CANopen 的 MCU 项目,那么我比较推荐关注一下这个仓库:wdfk-prog/can...

2026-08-28
RT-Thread 如何用 MPU 做线程栈保护
RT-Thread 如何用 MPU 做线程栈保护 摘要:结合 RT-Thread 当前 Cortex-M4 实现,拆解 MPU 内存保护、线程双 Guard 区、上下文切换重装载以及 MemManage Fault 的完整运行链路。 在 Cortex-M 系列 MCU 上,线程栈溢出一直是最难排查的一类故障之一。它往往不是在“栈刚好用完”的那一刻表现为明确错误,而是先覆盖相邻内存,再以随机变量异常、链表损坏、HardFault、跑飞甚至数分钟后的非确定性故障出现。 RT-Thread 传统的 RT_USING_OVERFLOW_CHECK 可以对线程栈做软件检查,但软件检查本质上依赖检查时机:如果栈已经越界,在下一次检查发生之前,相邻内存仍可能先被破坏。 另一条路线是利用 Cortex-M 自带的 MPU(Memory Protection Unit)。RT-Thread 的 RT_USING_MEM_PROTECTION 提供了 MPU 抽象层,而 RT_USING_HW_STACK_GUARD 则进一步利用 MPU,在每个线程栈的上下边界放置不可访问区域。一旦 CPU...

2025-10-03
littlefs
littlefs123456789101112131415161718192021// Users can override lfs_util.h with their own configuration by defining// LFS_CONFIG as a header file to include (-DLFS_CONFIG=lfs_config.h).//// If LFS_CONFIG is used, none of the default utils will be emitted and must be// provided by the config file. To start, I would suggest copying lfs_util.h// and modifying as needed.#ifdef LFS_CONFIG#define LFS_STRINGIZE(x) LFS_STRINGIZE2(x)#define LFS_STRINGIZE2(x) #x#include LFS_STRINGIZE(LFS_CONFIG) 机制 断电恢...
评论



