c++;数学/十六进制问题 对不起,如果这听起来有点“NoBey”,但我不知道C++,我在看一些柏林噪音的代码,试图在我遇到时找出答案。
c++;数学/十六进制问题 对不起,如果这听起来有点“NoBey”,但我不知道C++,我在看一些柏林噪音的代码,试图在我遇到时找出答案。,c++,math,hex,C++,Math,Hex,&0x7fffffff 及 (n&是按位AND运算符。因此&0x7fffffff从32位整数中剥离有符号位。这意味着,它使int的最左边位为零 在第二个例子中,第一个n被左移位为13,使用&在C++ 按位AND运算符(&)将第一个操作数的每一位与第二个操作数的对应位进行比较。如果两位均为1,则相应的结果位设置为1。否则,相应的结果位设置为0 11111111 11110000 & 00000000 01100011 _________________
&0x7fffffff
及
(n&
是按位AND运算符。因此&0x7fffffff
从32位整数中剥离有符号位。这意味着,它使int
的最左边位为零
在第二个例子中,第一个n
被左移位为13,使用&
在C++
按位AND运算符(&)将第一个操作数的每一位与第二个操作数的对应位进行比较。如果两位均为1,则相应的结果位设置为1。否则,相应的结果位设置为0
11111111 11110000
& 00000000 01100011
_________________
00000000 01100000
0 1 0 1 0 1 1 0
^ 0 0 1 1 0 0 1 0
___________________
0 1 1 0 0 1 0 0
第一个表达式是位掩码。它基本上清除数字的高位,或等效地计算2^31以上数字的模
第二个表达式是移位,后跟xor。在算术中,这与将n乘以2^13,然后翻转移位版本和自身之间的所有公共位相同。在柏林噪声代码中,它的目的是计算x,y坐标的程序空间散列,以便它们可以用于为noi种子硒发生器
许多程序内容中都使用了这种技术来创建动态变化的伪随机数生成器,这些生成器在空间中具有确定性变化。这些哈希基本上是复杂的、难以预测的、近乎随机的函数,通常是通过理论、猜测和实验的混合发现的因此,我不建议您在本例中过多地思考它为什么使用该特定公式。符号&
,<0x7fffffff
表示(假定)的设置位3132位整数为零,保留位0到30的值;IOW,使32位整数为正;IOW,取整数的绝对值
(n但如果是某个数字和0x7fffffff,那不总是返回0x7fffff吗?谢谢你解释好的,现在让我们把0x7fffff缩短为0x7f。那么假设你在做151和0x7f-在二进制中,这是10010111和01111111。通过取两个操作数中都是1的所有位,结果是00010111。它做了什么?它是屏蔽了第一位。你的答案是151,去掉了第一位。答案是23。就像n=n*2^13;t=(长数字)/2^31;
?@user677756:不完全一样。第一个表达式是t=(长数字)%pow(2,31)。第二个表达式是n=(n*pow(2,13))+n-(添加时携带的所有位)好的,这更有意义,但还有最后一个问题,到底什么是位,我如何找到添加时携带的位?(我不知道任何c,只是lua、php和html,对不起)@user677756:Wikipedia是你的朋友:这就是所谓的。它就像常规算术运算一样,除了这些运算符直接与位相关。
0 1 0 1 0 1 1 0
^ 0 0 1 1 0 0 1 0
___________________
0 1 1 0 0 1 0 0