首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >App Inventor 2 有没有左位移和右位移块?可以这样移,已做成通用函数

App Inventor 2 有没有左位移和右位移块?可以这样移,已做成通用函数

原创
作者头像
用户10956490
发布2026-08-31 10:38:01
发布2026-08-31 10:38:01
670
举报

App Inventor 2 有没有左位移和右位移块?可以这样移,已做成通用函数

摘要:数学块里翻遍了也找不到 << 和 >>。其实左移就是乘 2,右移就是除 2 再取整——两块积木的事。顺手还写了个通用函数版本。

写标志位的时候,卡在了移位上

做硬件联动的项目时,不少人会碰到一类需求:用二进制的每一位当开关。第 0 位是电机,第 1 位是蜂鸣器,第 2 位是灯……一个数字就能装下八个设备的状态,存 TinyDB 也只占一个格子。

于是你想把某一位挪到指定位置,自然要找"左移""右移"。打开数学抽屉,按位与、按位或、按位异或都在,唯独移位没有。

这不是漏做了,App Inventor 的数学块本来就没提供移位运算。但移位这件事,用乘除就能等价做出来,一点都不绕。

左移:就是乘 2

二进制里左移一位,所有位往左挪一格,低位补 0。101(也就是 5)左移一位变成 1010,正好是 10——翻倍了。

所以:左移 1 位 = ×2,左移 n 位 = ×2ⁿ。

移一位,直接用乘法块;移多位,接一块幂运算块,底数填 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)。任何值、移多少位,一个函数搞定。

参数化的移位函数
参数化的移位函数

文档里给了完整的按钮加标签的演示,积木照抄就能跑。

什么时候会真的用到移位

日常做界面、做小游戏,可能一年也碰不到移位一次。但这些场景离不开它:

  • 把多个开关状态压成一个数字,或者反过来拆开;
  • 硬件通信协议里的寄存器操作、位掩码;
  • 自己实现进制转换、解析位图数据;
  • 和已有的按位运算打配合:与用来取出某一位,或用来置 1,异或用来翻转,移位用来挪位置。

这么一看,常用的位操作在 App Inventor 里就算凑齐了。

文档在这里

完整案例(含通用函数版本)已经更新到数学块文档的"案例"一节,可以在官网的 reference/blocks/math 文档中查看。

从"把二进制的某一位改成 1",到"某一位改成 0",再到这次的左移右移,位操作的常用案例都齐了。下次再碰到数学抽屉里没有的运算,先想想它能不能用基础块拼出来——多数时候,答案是能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • App Inventor 2 有没有左位移和右位移块?可以这样移,已做成通用函数
    • 写标志位的时候,卡在了移位上
    • 左移:就是乘 2
    • 右移:除完 2,别忘了取整
    • 做成通用函数,位数当参数传
    • 什么时候会真的用到移位
    • 文档在这里
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档