杂项
发表于|更新于|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 扇区 和 磁道下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图中绿色部分),对于老式磁盘,每个扇区存储容量是相同的(也就是每个磁道的容量是相同的,但不同磁道的数据密度是不同的,半径越小的磁道的密度越大,这个是怎么做到的,还不清楚,但我个人猜测是因为旋转角度,转动相同的角度,外部扇区移动的距离更长,而内部扇区移动距离短,就是通过磁头每次移动是固定角度的,但由于磁臂的长度不同,分别对应不同的磁道,那对于外围的扇区,由于磁臂较长,每次移动固定角度,则划过的...

2025-10-03
RT-Thread 学习笔记
RT-Thread 学习笔记 其他资料 1.1. fatfs 1.1.1. fatfs.md 2. ARM指针寄存器.md 3. CAN驱动.md 4. completion.md 5. condvar.md 6. dataqueue.md 7. DFS.md 8. fal.md 9. fatfs.md 10. FINSH模块.md 11. I2C驱动.md 12. IDLE线程.md 13. IPC.md 14. littlefs.md 15. map文件分析.md 16. pipe.md 17. PM电源管理.md 18. readme.md 19. ringblock.md 20. ringbuffer.md 21. romfs.md 22. RTC.md 23. RT-LINK.md 24. RTT系统初始化.md 25. SDMMC.md 26. SIGNAL.md 27. SPI驱动.md 28. tmpfs.md 29. ULOG.md 30. USB.md 31. waitqueue.md 32. 串口驱动.md 33. 调度.md 34. 工作队列...

2025-10-03
map文件分析
map文件分析1234567891011121314151617181920212223242526272829303132333435363738394041424344454647Image$$ER_IROM1$$Base 0x90000000 Number 0 anon$$obj.o ABSOLUTE__Vectors 0x90000000 Data 4 startup_stm32h750xx.o(RESET)__Vectors_End 0x90000298 Data 0 startup_stm32h750xx.o(RESET)__main 0x90000299 Thumb Code 0 entry.o(.ARM.Collect$$$$00000000)_main_st...

2025-10-03
pipe
pipepipe: 匿名管道。pipe 是一种 IPC 机制,他的作用是用作有血缘进程间完成数据传递,只能从一端写入,从另外一端读出。为了解决 pipe 的弊端,linux 又引入了 mkfifo(实名管道)。 创建管道12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455rt_pipe_t *rt_pipe_create(constchar *name, intbufsz){ //分配管道内存,初始化锁,初始化等待队列,初始化条件变量 rt_mutex_init(&pipe->lock, name, RT_IPC_FLAG_FIFO); rt_wqueue_init(&pipe->reader_queue); rt_wqueue_init(&pipe->writer_queue); rt_condvar_init(&pipe->waitf...

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) 机制 断电恢...

2025-10-03
ringbuffer
ringbuffer buffer_ptr 是指向缓冲区的指针,buffer_size 是缓冲区的大小,read_index 是读索引,write_index 是写索引,而 read_mirror 和 write_mirror 可以理解为一种镜像值,每次向缓冲区写入数据,碰到缓冲区末尾时,切换到另一个镜像的缓冲区头部写入剩余数据。这种镜像操作可用于判断缓冲区内数据是满还是空。 等于是把缓冲区回绕了看做为另一个缓冲区,通过镜像值来判断缓冲区的状态,当前读写指针是否进入到另一个缓冲区中; 当 write_index == read_index 且 read_mirror == write_mirror 时,缓冲区内数据为空。 当 write_index == read_index 且 read_mirror != write_mirror 时,缓冲区内数据已满。 若是没有上述镜像值,我们就没有办法区分缓冲区空和缓冲区满这两种情况。 注意:RT-Thread 的 ringbuffer 组件并未提供线程阻塞的功...
评论
公告
欢迎光临!有任何问题或想法,欢迎在文章下留言交流,或者通过 关于页面 联系我。

