在 ARMv8 程序集中用什么和一个随机数来限制 0 到 9 之间的范围?
What to and a random number with to constrain range between 0 to 9 in ARMv8 Assembly?
我正在尝试在 ARMv8 中创建随机数数组。
我成功地创建了一个随机数数组,但是,我的指令限制了数组;具体来说,and
指令和 cmp 将其限制在 0 到 12 的范围内,而不是 0 到 9。
这是我的代码:
bl rand //branch to random num
and x22, x0, 0x0C
add x18,x18, x22
cmp x22,x23 //compare x23 register to x22
b.lt mini //branch to minimum calculation
如您所见,我使用的是 x0 和 0x0C,十六进制为 12。
有人说最好的办法是使用 0xFF 或十六进制的 255,但这给了我很大的数字,因此 Ox0C 给了我迄今为止最好的结果,但并不理想,因为我需要它们介于 0 和9.
一个例子 table 我目前正在 运行 程序 :
0 0 0 8 0
12 8 12 4 12
4 4 0 4 12
4 12 12 12 4
12 8 8 8 4
和理想的 table 示例(我只是从 12 中删除了 1 或 2 以演示单个数字随机 table,这不是实际的生成):
0 0 0 8 0
2 8 1 4 2
4 4 0 4 1
4 1 1 2 4
1 8 8 8 4
仅使用 and
无法完成。 1、2、4 和 8 的位模式是
0b0001
0b0010
0b0100
0b1000
唯一允许所有这些的位掩码是 0b1111,它允许最大 15 的任何数字。如果你想将你的值限制在 0-9 的范围内,你有两个基本选项:
- 您可以使用整数除法来缩小具有较大范围的生成器的范围。这往往会对某些数字产生轻微的偏见。
- 您可以
and
使用位掩码 0x0f
将范围缩小到 0-15。如果数字大于 9,则丢弃它并生成一个新的随机数。这是公正的,但不能保证生成可接受的数字需要多长时间。
我正在尝试在 ARMv8 中创建随机数数组。
我成功地创建了一个随机数数组,但是,我的指令限制了数组;具体来说,and
指令和 cmp 将其限制在 0 到 12 的范围内,而不是 0 到 9。
这是我的代码:
bl rand //branch to random num
and x22, x0, 0x0C
add x18,x18, x22
cmp x22,x23 //compare x23 register to x22
b.lt mini //branch to minimum calculation
如您所见,我使用的是 x0 和 0x0C,十六进制为 12。
有人说最好的办法是使用 0xFF 或十六进制的 255,但这给了我很大的数字,因此 Ox0C 给了我迄今为止最好的结果,但并不理想,因为我需要它们介于 0 和9.
一个例子 table 我目前正在 运行 程序 :
0 0 0 8 0
12 8 12 4 12
4 4 0 4 12
4 12 12 12 4
12 8 8 8 4
和理想的 table 示例(我只是从 12 中删除了 1 或 2 以演示单个数字随机 table,这不是实际的生成):
0 0 0 8 0
2 8 1 4 2
4 4 0 4 1
4 1 1 2 4
1 8 8 8 4
仅使用 and
无法完成。 1、2、4 和 8 的位模式是
0b0001
0b0010
0b0100
0b1000
唯一允许所有这些的位掩码是 0b1111,它允许最大 15 的任何数字。如果你想将你的值限制在 0-9 的范围内,你有两个基本选项:
- 您可以使用整数除法来缩小具有较大范围的生成器的范围。这往往会对某些数字产生轻微的偏见。
- 您可以
and
使用位掩码0x0f
将范围缩小到 0-15。如果数字大于 9,则丢弃它并生成一个新的随机数。这是公正的,但不能保证生成可接受的数字需要多长时间。