仅使用算术运算符复制变量
Copying a variable with only arithmetic operators
在没有直接赋值函数的情况下,将一个变量的值复制到另一个变量的最佳方法是什么?
变量是 2 字节定点数,最大值为 2147483.647。可用的运算符是(为清楚起见重新格式化):
add(<variable>, <constant>)
将常量值添加到给定变量
subtract(<variable>, <constant>)
减去
multiply(<variable>, <constant>)
乘以
divide(<variable>, <constant>)
除
check(<variable1>, <op>, <variable2/constant>)
使用运算符 op
和 returns 布尔值比较 variable1
和 <variable2/constant>
的值。 op
可以是 =
、<
、<=
、>=
或 >
set(<variable>, <constant>)
设置变量的值。
- 脚本语言有基本的控制流,它有
while
和if
(但没有else
)以及基本的布尔运算符AND
、OR
、NOT
和 NOR
.
我们的第一次尝试很简单:
while = {
count = var1 //loop var1 times
change_variable = { which = var2 value = 1 } //increment by one
}
我的下一次尝试是:
set_variable = { which = new value = 1 }
while = {
limit = { NOT = { check_variable = { which = old value = new} } }
if = {
limit = {
check_variable = { which = old value > new }
check_variable = { which = stage value = 0 }
}
multiply_variable = { which = new value = 10 }
}
if = {
limit = {
check_variable = { which = stage value = 0 }
check_variable = { which = old value < new }
}
set_variable = { which = stage value = 1 }
}
if = {
limit = {
check_variable = { which = stage value = 1 }
check_variable = { which = old value < new }
}
subtract_variable = { which = new value = 1 }
}
}
例如,从 1 开始,乘以 10 直到大于目标,然后减去 1 直到达到目标。
但我确信有更好的方法来做到这一点。
上下文:
游戏 "Stellaris" 中使用的脚本语言的最新补丁破坏了变量赋值功能。 set
以上应该是set(<variable>, <variable/constant>
)。这已经破坏了很多现有代码,而且不知道它会破坏多久。
因为 2147483.647 是(2 - 1 的幂)/1000 我可以使用 2 的连续幂来一次求出 1 位的解:(用 C 语言编写,仅使用等效运算)
result = 0;
result += 1073741.824;
if( var < result )
result -= 1073741.824;
result += 536870.912;
if( var < result)
result -= 536870.912;
result += 268435.456;
if( var < result)
result -= 268435.456;
result += 134217.728;
if( var < result)
result -= 134217.728;
result += 67108.864;
if( var < result)
result -= 67108.864;
result += 33554.432;
if( var < result)
result -= 33554.432;
result += 16777.216;
if( var < result)
result -= 16777.216;
result += 8388.608;
if( var < result)
result -= 8388.608;
result += 4194.304;
if( var < result)
result -= 4194.304;
result += 2097.152;
if( var < result)
result -= 2097.152;
result += 1048.576;
if( var < result)
result -= 1048.576;
result += 524.288;
if( var < result)
result -= 524.288;
result += 262.144;
if( var < result)
result -= 262.144;
result += 131.072;
if( var < result)
result -= 131.072;
result += 65.536;
if( var < result)
result -= 65.536;
result += 32.768;
if( var < result)
result -= 32.768;
result += 16.384;
if( var < result)
result -= 16.384;
result += 8.192;
if( var < result)
result -= 8.192;
result += 4.096;
if( var < result)
result -= 4.096;
result += 2.048;
if( var < result)
result -= 2.048;
result += 1.024;
if( var < result)
result -= 1.024;
result += 0.512;
if( var < result)
result -= 0.512;
result += 0.256;
if( var < result)
result -= 0.256;
result += 0.128;
if( var < result)
result -= 0.128
result += 0.064;
if( var < result)
result -= 0.064;
result += 0.032;
if( var < result)
result -= 0.032;
result += 0.016;
if( var < result)
result -= 0.016;
result += 0.008;
if( var < result)
result -= 0.008;
result += 0.004;
if( var < result)
result -= 0.004;
result += 0.002;
if( var < result)
result -= 0.002;
result += 0.001;
if( var < result)
result -= 0.001;
只需要 32 次比较(如果您可以接受较低的精度或知道上限,则更少)。
在没有直接赋值函数的情况下,将一个变量的值复制到另一个变量的最佳方法是什么?
变量是 2 字节定点数,最大值为 2147483.647。可用的运算符是(为清楚起见重新格式化):
add(<variable>, <constant>)
将常量值添加到给定变量subtract(<variable>, <constant>)
减去multiply(<variable>, <constant>)
乘以divide(<variable>, <constant>)
除check(<variable1>, <op>, <variable2/constant>)
使用运算符op
和 returns 布尔值比较variable1
和<variable2/constant>
的值。op
可以是=
、<
、<=
、>=
或>
set(<variable>, <constant>)
设置变量的值。- 脚本语言有基本的控制流,它有
while
和if
(但没有else
)以及基本的布尔运算符AND
、OR
、NOT
和NOR
.
我们的第一次尝试很简单:
while = {
count = var1 //loop var1 times
change_variable = { which = var2 value = 1 } //increment by one
}
我的下一次尝试是:
set_variable = { which = new value = 1 }
while = {
limit = { NOT = { check_variable = { which = old value = new} } }
if = {
limit = {
check_variable = { which = old value > new }
check_variable = { which = stage value = 0 }
}
multiply_variable = { which = new value = 10 }
}
if = {
limit = {
check_variable = { which = stage value = 0 }
check_variable = { which = old value < new }
}
set_variable = { which = stage value = 1 }
}
if = {
limit = {
check_variable = { which = stage value = 1 }
check_variable = { which = old value < new }
}
subtract_variable = { which = new value = 1 }
}
}
例如,从 1 开始,乘以 10 直到大于目标,然后减去 1 直到达到目标。
但我确信有更好的方法来做到这一点。
上下文:
游戏 "Stellaris" 中使用的脚本语言的最新补丁破坏了变量赋值功能。 set
以上应该是set(<variable>, <variable/constant>
)。这已经破坏了很多现有代码,而且不知道它会破坏多久。
因为 2147483.647 是(2 - 1 的幂)/1000 我可以使用 2 的连续幂来一次求出 1 位的解:(用 C 语言编写,仅使用等效运算)
result = 0;
result += 1073741.824;
if( var < result )
result -= 1073741.824;
result += 536870.912;
if( var < result)
result -= 536870.912;
result += 268435.456;
if( var < result)
result -= 268435.456;
result += 134217.728;
if( var < result)
result -= 134217.728;
result += 67108.864;
if( var < result)
result -= 67108.864;
result += 33554.432;
if( var < result)
result -= 33554.432;
result += 16777.216;
if( var < result)
result -= 16777.216;
result += 8388.608;
if( var < result)
result -= 8388.608;
result += 4194.304;
if( var < result)
result -= 4194.304;
result += 2097.152;
if( var < result)
result -= 2097.152;
result += 1048.576;
if( var < result)
result -= 1048.576;
result += 524.288;
if( var < result)
result -= 524.288;
result += 262.144;
if( var < result)
result -= 262.144;
result += 131.072;
if( var < result)
result -= 131.072;
result += 65.536;
if( var < result)
result -= 65.536;
result += 32.768;
if( var < result)
result -= 32.768;
result += 16.384;
if( var < result)
result -= 16.384;
result += 8.192;
if( var < result)
result -= 8.192;
result += 4.096;
if( var < result)
result -= 4.096;
result += 2.048;
if( var < result)
result -= 2.048;
result += 1.024;
if( var < result)
result -= 1.024;
result += 0.512;
if( var < result)
result -= 0.512;
result += 0.256;
if( var < result)
result -= 0.256;
result += 0.128;
if( var < result)
result -= 0.128
result += 0.064;
if( var < result)
result -= 0.064;
result += 0.032;
if( var < result)
result -= 0.032;
result += 0.016;
if( var < result)
result -= 0.016;
result += 0.008;
if( var < result)
result -= 0.008;
result += 0.004;
if( var < result)
result -= 0.004;
result += 0.002;
if( var < result)
result -= 0.002;
result += 0.001;
if( var < result)
result -= 0.001;
只需要 32 次比较(如果您可以接受较低的精度或知道上限,则更少)。