在 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 的范围内,你有两个基本选项:

  1. 您可以使用整数除法来缩小具有较大范围的生成器的范围。这往往会对某些数字产生轻微的偏见。
  2. 您可以 and 使用位掩码 0x0f 将范围缩小到 0-15。如果数字大于 9,则丢弃它并生成一个新的随机数。这是公正的,但不能保证生成可接受的数字需要多长时间。