摘要:数学块里翻遍了也找不到 << 和 >>。其实左移就是乘 2,右移就是除 2 再取整——两块积木的事。顺手还写了个通用函数版本。
做硬件联动的项目时,不少人会碰到一类需求:用二进制的每一位当开关。第 0 位是电机,第 1 位是蜂鸣器,第 2 位是灯……一个数字就能装下八个设备的状态,存 TinyDB 也只占一个格子。
于是你想把某一位挪到指定位置,自然要找"左移""右移"。打开数学抽屉,按位与、按位或、按位异或都在,唯独移位没有。
这不是漏做了,App Inventor 的数学块本来就没提供移位运算。但移位这件事,用乘除就能等价做出来,一点都不绕。
二进制里左移一位,所有位往左挪一格,低位补 0。101(也就是 5)左移一位变成 1010,正好是 10——翻倍了。
所以:左移 1 位 = ×2,左移 n 位 = ×2ⁿ。
移一位,直接用乘法块;移多位,接一块幂运算块,底数填 2,指数填位数就行。
右移的坑要多一点。
右移一位等于 ÷2,但 App Inventor 的除法块是普通除法,5 / 2 得到的是 2.5,不是 2。而二进制里 101 右移一位是 10,最低位直接被丢掉了,不会留下小数。
所以右移必须在除法后面再接一块"下取整":右移 n 位 = ÷2ⁿ 后下取整。
几组例子放在一起看就清楚了:
操作 | 原值 | 等价运算 | 二进制变化 | 结果 |
|---|---|---|---|---|
左移 1 位 | 5 | 5 × 2 | 101 → 1010 | 10 |
左移 2 位 | 5 | 5 × 4 | 101 → 10100 | 20 |
右移 1 位 | 5 | floor(5 / 2) | 101 → 10 | 2 |
右移 2 位 | 5 | floor(5 / 4) | 101 → 1 | 1 |
有个细节值得一提:负数同样成立。floor(-5 / 2) = -3,不是 -2。这和多数语言里算术右移的语义一致,对着硬件协议算的时候不用担心两边对不上。

固定移一位两位,直接乘除就够了。但如果移多少位是运行时才算出来的——比如从蓝牙指令里读到一个偏移量——一个个拼积木就不现实了。
办法是把移位包成函数,位数做成参数:

调用的时候,左移(5, 3) 得 40(101 → 101000),右移(20, 2) 得 5(10100 → 101)。任何值、移多少位,一个函数搞定。

文档里给了完整的按钮加标签的演示,积木照抄就能跑。
日常做界面、做小游戏,可能一年也碰不到移位一次。但这些场景离不开它:
这么一看,常用的位操作在 App Inventor 里就算凑齐了。
完整案例(含通用函数版本)已经更新到数学块文档的"案例"一节,可以在官网的 reference/blocks/math 文档中查看。
从"把二进制的某一位改成 1",到"某一位改成 0",再到这次的左移右移,位操作的常用案例都齐了。下次再碰到数学抽屉里没有的运算,先想想它能不能用基础块拼出来——多数时候,答案是能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。