你还记得上次这个帖子吗(点击进入)
(图片已修复,建议大家使用微博图床)
这次我们将这个项目进一步完善,现在新增了三个模块:xors()、Leftshift(int length)、Rightshift(int length)
第一个模块是void,直接进行异或运算;
第二个,第三个需要一个具体的值,代表左移/右移长度。
目录
P1 预览&相关链接
P2 二进制移位操作&指令源码
P3 二进制异或操作&指令源码
P4 存档&.pcb
这便是新增的两个模块
至于什么是异或、移位,可以百科(比本人讲的清楚):
异或
左移
右移
原理非常简单,有了之前搭建好的操作框架,这三个功能的实现也就并不难;
如果还不清楚,可以直接看后面帖子,通过展示如何操作你也可以理解。
二进制移位操作
首先输入一个二进制数字,10111
- 左移
给计分板‘Leftshift’加分,对象是全体number1,分数代表左移长度
接着10111左移三位成为10111000
- 右移
给计分板‘Rightshift’加分,对象是全体number1,分数代表右移长度
接着10111000右移五位成为101
源码:
- //左移
- rcb:/tp @e[tag=number1,score_Leftshift_min=1] ~1 ~ ~
- *全体移位
- cond:execute @e[tag=Tper] ~ ~ ~ execute @e[tag=number1,score_Leftshift_min=1,c=-1] ~ ~ ~ summon armor_stand ~-1 ~ ~ {Tags:[lshift,num0s,bit,number1],CustomName:0,CustomNameVisible:1}
- *起始位生成一个新的'0'
- cond:/tp @e[tag=Tper] ~1 ~ ~
- *标记移位
- /scoreboard players operation @e[tag=lshift] Leftshift = @e[tag=number1,score_Leftshift_min=1] Leftshift
- /scoreboard players tag @e[tag=lshift] remove lshift
- /scoreboard players reset @e[tag=number1,score_Leftshift=0] Leftshift
- /scoreboard players remove @e[tag=number1,score_Leftshift_min=1] Leftshift 1
- *组成一个循环
- //右移
- rcb:/tp @e[tag=number1,score_Rightshift_min=1] ~-1 ~ ~
- *全体移位
- cond:execute @e[tag=Tper] ~ ~ ~ kill @e[tag=number1,score_Rightshift_min=1,c=-1]
- *清除起始位的数字
- cond:/tp @e[tag=Tper] ~1 ~ ~
- *标记移位
- /scoreboard players reset @e[tag=number1,score_Rightshift=0] Rightshift
- /scoreboard players remove @e[tag=number1,score_Rightshift_min=1] Rightshift 1
- *组成一个循环
二进制异或操作
两个二进制数字101100101,101011010
按下这个按钮,调用xors()
得到结果。(相同取0,不同取1)
101100101
101011010
得000111111
源码:
- //预操作
- rcb:/execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=bit] add xord0
- /execute @p[tag=xors] ~ ~ ~ /execute @e[tag=number1] ~ ~ ~ /scoreboard players tag @e[tag=number2,r=0] add xord2
- /execute @p[tag=xors] ~ ~ ~ /execute @e[tag=number2] ~ ~ ~ /scoreboard players tag @e[tag=number1,r=0] add xord1
- *取重合的数字分别标记xord2,xord1
- /execute @p[tag=xors] ~ ~ ~ /scoreboard players tag @e[tag=xord1] remove xord0
- /execute @p[tag=xors] ~ ~ ~ /scoreboard players tag @e[tag=xord2] remove xord0
- *没有重合的数字是xord0
- //操作
- /execute @p[tag=xors] ~ ~ ~ execute @e[tag=xord2] ~ ~ ~ scoreboard players operation @e[tag=xord2,r=0] str -= @e[tag=xord1,r=0] str
- *重合的数字相减
- /execute @p[tag=xors] ~ ~ ~ /execute @e[tag=xord2,score_str=0,score_str_min=0] ~ ~ ~ scoreboard players tag @e[tag=xord1,r=0] add isxor
- *如果相减得零,标记isxor,表示相同
- /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord0,score_str=0] add isxor
- *如果不重合的数字为0,标记isxor,表示相同
- //结束
- /execute @p[tag=xors] ~ ~ ~ execute @p[tag=xors] ~ ~ ~ kill @e[tag=xord2]
- *消除重合部分的标记为xord2的数字
- /execute @p[tag=xors] ~ ~ ~ scoreboard players set @e[tag=bit] str 1
- /execute @p[tag=xors] ~ ~ ~ scoreboard players set @e[tag=isxor] str 0
- *所有二进制数字取1,相同的设为0,所以不同的就是1了
- /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=isxor] remove isxor
- /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord0] remove xor0
- /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord1] remove xor1
- /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @p remove xors
- *重置模块
仍未封装完成,将会持续更新: