位运算——判断整数a是否可被2的幂(2、4、8、16……)整除?

本文探讨了位运算在编程中的应用,特别是如何利用位运算实现快速求模操作,以及在调试模式下性能优势。通过简化表达式,提高程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 大部分位运算的技巧早在几十年前就被前辈们在有限的计算环境下“榨”出来了。
// “原创”只是表示这篇文章是我所写,并非翻译或转贴,但也绝不是我“首创”。

能被2^N整除(N >= 1),则a的二进制表示中,低N位全为0,因此:

(a % 2) <==> (a & 1) (a % 4) <==> (a & 3) (a % 8) <==> (a & 7) (a % 16) <==> (a & 15) <==> (a & ((1 << 4) - 1)) ……

现在的编译器已经足够聪明,上面左边的表达式很可能会被自动优化,所以可能看不出求余与按位与的性能差距。
但能在DEBUG模式下快一点,还是有价值的。(设想正常要跑一分钟的程序,调试时需要10分钟才能运行到你所下的断点,会是多么痛苦……)

lisp表达式c语言 Lisp 表达式是一种基于前缀表示法的编程风格,而 C 语言则是一种过程式的通用编程语言。两者的语法和设计理念有很大的差异,但在某些场景下可以将 Lisp 的思想引入到 C 中。 什么是 Lisp 表达式? Lisp 是一种函数式编程语言,其表达式通常采用“前缀记法”。例如,在数学上 (a + b) 被写成 (+ a b) 形式。这种形式易于解析并支持递归操作。 在 C 语言中如何实现类似的功能? 虽然 C 并不是天生支持像 Lisp 这样的功能特性,但我们可以通过自定义数据结构来模拟一些 Lisp 特性的行为。比如构建链表、树等抽象数据类型,并通过递归来处理嵌套的数据结构。 示例: 假设我们需要计算一个简单的算术表达式,可以用类似于 Lisp 风格的方式编写: #include <stdio.h> // 模拟加法运算 int add(int x, int y) { return x + y; } // 主程序入口 int main() { // 使用C语言模仿简单LISP样式调用 (add 10 5) printf("Result of (+ 10 5): %d\n", add(10, 5)); return 0; } 这个例子仅展示了最基本的概念映射——即把 Lisp 样式的(+)翻译成了普通函数add()。 如果想要更深入地学习如何结合两者特点,则需要研究更多高级主题如AST(Abstract Syntax Trees),解释器设计模式等等。 lisp是一种非常古老的计算机语言,是由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言,其语法如下: (+ 2 3 4 5) 表示2+3+4+5,其值为14 (* 2 3 5) 表示235,其值为30 减法可以表示为: (- 2 3 4) 表示:2-3-4=-5 整除可以表示为: (/ 8 2 1) 表示:8/2/1=4 即括弧中第一个符号为运算符,后面是操作数,该运算也可以嵌套,比如 (* (+ 2 3) 6) 表示先计算2+3=5,然后再56=30 麦卡锡当初提出了一套理论,其核心是一个eval函数,1958年年底,麦卡锡的一个学生史蒂夫•拉塞尔 看到了eval函数的定义,意识到如果把它翻译成机器语言,就可以把Lisp解释器做出来。这在当时是非常令人吃惊的事。麦卡锡后来回忆:拉塞尔对我说:“我想把eval编成程序……”我告诉他,别把理论和实践混淆,eval只是用来读的,不是用来做计算的。但是他执意要做,并且还真的做出来了。就是说,他把我论文中的eval编译成了[IBM] 704计算机的机器码,修正了bug,然后对外宣布做出了Lisp语言的一种解释器,这倒没有说错,确实如此。所以,从那个时候开始,Lisp语言就基本上是它现在的样子了…… 现在,请你完成这个任务, 给出一个lisp表达式,计算出其结果。 输入 一个lisp表达式 输出 该表达式的值 样例输入 (+ 2 ( 3 4) (- 3 5)) 样例输出 12 提示 可以使用函数嵌套和函数指针来实现
最新发布
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值