将伪代码转换为Python

3

提前说明,以下内容与一份作业有关,但本身并不是作业。作业要求使用噪声来生成酷炫的图形。我在Python方面有一些经验,但还不足以解决这个简单的问题。

我在生成区间为[-1,1]的随机种子时遇到了问题。我的老师给我提供的伪代码来源于Hugo Elias

伪代码:

function Noise1(integer x, integer y)
    n = x + y * 57
    n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
  end function

我在Python中的尝试:

def noise(x, y):
    n = x + y * 57
    n = (n<<5) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0)

问题出在返回语句中的& 7fffffff位上。首先,我不确定那个操作是什么。也许是位移?其次,我不知道如何在Python中执行该操作。我只是将那部分删除了,但我得到的是非常大的负数,远远不是[-1,1]范围内的数。

2
这段伪代码中的^是指数运算符还是异或运算符,我无法确定。 - Jesus Ramos
& 是位运算符(二进制AND),在Python中可以直接使用。 - Serdalis
@Serdalis,& 7fffffff 怎么办?我该如何在Python中实现它? - jb.
1
@jb 我认为更安全的做法是假设这里使用的是按位异或,因为代码中还使用了其他按位操作,并且应该小心不要在非按位上下文中使用按位符号。 在Python中,& 0x7FFFFFFF - Serdalis
1
我不确定其他数字,但 7fffffff 是十六进制,在 Python 中需要写作 0x7fffffff,这样 Python 才能正确解释。在较新的 Python 版本中,也可以使用 '0b' 表示二进制。 - Eli Collins
显示剩余4条评论
3个回答

3
& 符号代表按位与操作。
^ 符号代表按位异或操作。
7FFFFFFF 是一个十六进制数,在编程中,您可以使用0x表示十六进制数,其中7FFFFFFF0x7FFFFFFF
有关十六进制数的更多阅读内容。
在Python中执行二进制AND操作,只需要使用& 0x7FFFFFFF
有关Python中按位运算的详细信息,请参见此处

1

我在你现有的代码中将7FFFFFFF替换为0x7FFFFFFF,并尝试插入一些随机值,所有得到的答案都在[-1, 1]之间。


1
问题在于返回语句中的 & 7fffffff 位。首先,我不确定那个操作是什么。也许是位移?
这是一个位掩码。<< 用于移位。& 是按位与。将 7fffffff 解释为十六进制数,它是一个数量,如果重新以二进制形式编写,则具有31位,所有位都是1。其效果是选择值的低31位。
要告诉Python应将 7fffffff 解释为十六进制数,必须在其前面加上0x,因此为0x7fffffff。
其次,我不确定如何在Python中执行该操作。
与伪代码相同的方式(即使用 &)执行即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接