Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: zobrist key table questions

Author: Robert Hyatt

Date: 11:06:41 06/02/04

Go up one level in this thread


On June 01, 2004 at 10:45:13, Heiner Marxen wrote:

>On May 30, 2004 at 18:35:57, Uri Blass wrote:
>
>>On May 30, 2004 at 18:20:15, Peter Fendrich wrote:
>>
>>>On May 30, 2004 at 18:09:49, Uri Blass wrote:
>>>
>>>>On May 30, 2004 at 17:51:13, Peter Fendrich wrote:
>>>>
>>>>>If zobrist is signed you will encounter problems when shifting it.
>>>>>/Peter
>>>>
>>>>I think that my zobrist is unsigned.
>>>>
>>>>
>>>>My function to generate "random" 64 bit numbers generate signed number but
>>>>return it as unsigned number
>>>>
>>>>I have
>>>>typedef unsigned __int64 BitBoard;
>>>>static BitBoard rand64()
>>>>{
>>>>  __int64 r = rand();
>>>>  r ^= (__int64)rand() << 15;
>>>>  r ^= (__int64)rand() << 30;
>>>>  r ^= (__int64)rand() << 45;
>>>>  r ^= (__int64)rand() << 60;
>>>>return r;
>>>>}
>>>>
>>>>BitBoard zobrist[6][2][64];
>>>>
>>>>zobrist[fil][i][j]=rand64();
>>>>
>>>>The problem is that when I do
>>>>
>>>>r1=(unsigned)zobrist[fil][i][j]&4294967295;
>>>>r2=(unsigned)(zobrist[fil][i][j]>>32);
>>>>r=r1 | (BitBoard) r2<<32;
>>>>
>>>>I get r!=zobrist[fil][i][j]
>>>>
>>>>Uri
>>>
>>>
>>>What made me think you have a signed zobrist are the
>>>rx=(unsigned)zobrist[fil][i][j].... statements. There is no reason to cast to
>>>unsigned if it's already unsigned.
>>>The statement:
>>>r2=(unsigned)(zobrist[fil][i][j]>>32);
>>>looks very strange to me because with parentheses you force the "(unsigned)"
>>>cast to be made after the shift is done. It makes no sence to to me whether it's
>>>signed or not.
>>>
>>>/Peter
>>
>>It seems that the problem is not the zobrist key but the fact that r1 and r2
>>were regular int
>>
>>I need to write the conversion to unsigned otherwise I get a warning of losing
>>information in conversion from 'unsigned __int64' to 'unsigned int
>>
>>Now it seems that I needs different numbers.
>>
>>I used the following function to print 32 numbers into the screen and later
>>copied them into the file.
>>
>>static BitBoard rand64()
>>{
>>  __int64 r = rand();
>   ^^^^^^^
>>  r ^= (__int64)rand() << 15;
>>  r ^= (__int64)rand() << 30;
>>  r ^= (__int64)rand() << 45;
>>  r ^= (__int64)rand() << 60;
>>  printf(" %u ",r);
>>  printf(" %u ",r>>32);
>
>You cannot print 64-bit numbers with "%u".  "%u" needs an (unsigned int):
>
>   printf(" %u  %u ", (unsigned)r, (unsigned)(r>>32)),
>
>Cheers,
>Heiner


Even better, since this is MSVC anyway:

%I64u will do just fine for 64 bit ints...

In gcc

%llu will do the trick...


>
>
>>  return r;
>>}
>>
>>I think that I will print them into the screen not inside BitBoard rand64() but
>>after I calculate the zob keys and I expect to get different numbers that I will
>>be able to translate them to the zobrist keys.
>>
>>Uri



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.