本帖最后由 贰逼 于 2019-3-7 23:05 编辑

你还记得上次这个帖子吗(点击进入)
(图片已修复,建议大家使用微博图床)
这次我们将这个项目进一步完善,现在新增了三个模块:xors()、Leftshift(int length)、Rightshift(int length)
第一个模块是void,直接进行异或运算
第二个,第三个需要一个具体的值,代表左移/右移长度。

目录
P1 预览&相关链接
P2 二进制移位操作&指令源码
P3 二进制异或操作&指令源码
P4 存档&.pcb

这便是新增的两个模块

至于什么是异或、移位,可以百科(比本人讲的清楚):
异或
左移
右移

原理非常简单,有了之前搭建好的操作框架,这三个功能的实现也就并不难;
如果还不清楚,可以直接看后面帖子,通过展示如何操作你也可以理解。
二进制移位操作

首先输入一个二进制数字,10111
  • 左移

给计分板‘Leftshift’加分,对象是全体number1,分数代表左移长度

接着10111左移三位成为10111000
  • 右移

给计分板‘Rightshift’加分,对象是全体number1,分数代表右移长度

接着10111000右移五位成为101

源码:
  1. //左移
  2. rcb:/tp @e[tag=number1,score_Leftshift_min=1] ~1 ~ ~
  3. *全体移位
  4. 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}
  5. *起始位生成一个新的'0'
  6. cond:/tp @e[tag=Tper] ~1 ~ ~
  7. *标记移位
  8. /scoreboard players operation @e[tag=lshift] Leftshift = @e[tag=number1,score_Leftshift_min=1] Leftshift
  9. /scoreboard players tag @e[tag=lshift] remove lshift
  10. /scoreboard players reset @e[tag=number1,score_Leftshift=0] Leftshift
  11. /scoreboard players remove @e[tag=number1,score_Leftshift_min=1] Leftshift 1
  12. *组成一个循环
  13. //右移
  14. rcb:/tp @e[tag=number1,score_Rightshift_min=1] ~-1 ~ ~
  15. *全体移位
  16. cond:execute @e[tag=Tper] ~ ~ ~ kill @e[tag=number1,score_Rightshift_min=1,c=-1]
  17. *清除起始位的数字
  18. cond:/tp @e[tag=Tper] ~1 ~ ~
  19. *标记移位
  20. /scoreboard players reset @e[tag=number1,score_Rightshift=0] Rightshift
  21. /scoreboard players remove @e[tag=number1,score_Rightshift_min=1] Rightshift 1
  22. *组成一个循环
复制代码

二进制异或操作

两个二进制数字101100101,101011010

按下这个按钮,调用xors()

得到结果。(相同取0,不同取1)
   101100101
   101011010
得000111111

源码:
  1. //预操作
  2. rcb:/execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=bit] add xord0
  3. /execute @p[tag=xors] ~ ~ ~ /execute @e[tag=number1] ~ ~ ~ /scoreboard players tag @e[tag=number2,r=0] add xord2
  4. /execute @p[tag=xors] ~ ~ ~ /execute @e[tag=number2] ~ ~ ~ /scoreboard players tag @e[tag=number1,r=0] add xord1
  5. *取重合的数字分别标记xord2,xord1
  6. /execute @p[tag=xors] ~ ~ ~  /scoreboard players tag @e[tag=xord1] remove xord0
  7. /execute @p[tag=xors] ~ ~ ~  /scoreboard players tag @e[tag=xord2] remove xord0
  8. *没有重合的数字是xord0
  9. //操作
  10. /execute @p[tag=xors] ~ ~ ~ execute @e[tag=xord2] ~ ~ ~ scoreboard players operation @e[tag=xord2,r=0] str -= @e[tag=xord1,r=0] str
  11. *重合的数字相减
  12. /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
  13. *如果相减得零,标记isxor,表示相同
  14. /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord0,score_str=0] add isxor
  15. *如果不重合的数字为0,标记isxor,表示相同
  16. //结束
  17. /execute @p[tag=xors] ~ ~ ~ execute @p[tag=xors] ~ ~ ~ kill @e[tag=xord2]
  18. *消除重合部分的标记为xord2的数字
  19. /execute @p[tag=xors] ~ ~ ~ scoreboard players set @e[tag=bit] str 1
  20. /execute @p[tag=xors] ~ ~ ~ scoreboard players set @e[tag=isxor] str 0
  21. *所有二进制数字取1,相同的设为0,所以不同的就是1了
  22. /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=isxor] remove isxor
  23. /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord0] remove xor0
  24. /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @e[tag=xord1] remove xor1
  25. /execute @p[tag=xors] ~ ~ ~ scoreboard players tag @p remove xors
  26. *重置模块
复制代码

仍未封装完成,将会持续更新:
二进制2.rar (925 Bytes, 下载次数: 1)
[groupid=546]Command Block Logic[/groupid]