76 lines
1.0 KiB
C++
76 lines
1.0 KiB
C++
#pragma once
|
|
|
|
template< typename INT, int gap >
|
|
struct scramble_map
|
|
{
|
|
scramble_map()
|
|
{
|
|
int len = sizeof( INT ) * 8;
|
|
|
|
for( int i = 0; i < len; ++i )
|
|
{
|
|
map[i] = i;
|
|
}
|
|
|
|
int idx = gap;
|
|
|
|
for( int i = 0; i < len; ++i )
|
|
{
|
|
|
|
char t = map[i];
|
|
|
|
while( idx >= len )
|
|
{
|
|
idx -= len;
|
|
}
|
|
|
|
map[i] = map[idx];
|
|
map[idx] = t;
|
|
|
|
idx += gap + i;
|
|
}
|
|
}
|
|
|
|
char & operator[]( unsigned idx ) { return map[idx]; }
|
|
const char & operator[]( unsigned idx ) const { return map[idx]; }
|
|
|
|
char map[sizeof(INT) * 8];
|
|
};
|
|
|
|
template< typename INT, int gap >
|
|
INT bits_scramble( INT c )
|
|
{
|
|
static scramble_map< INT, gap > map;
|
|
|
|
INT r = 0;
|
|
|
|
INT mask;
|
|
for( int i = 0; i < sizeof(INT)*8; i++ )
|
|
{
|
|
mask = 1 << i;
|
|
if ( c & mask )
|
|
r |= (1 << map[i]) ;
|
|
}
|
|
|
|
return r;
|
|
}
|
|
|
|
template< typename INT, int gap >
|
|
INT restore_bits_scramble( INT s )
|
|
{
|
|
static scramble_map< INT, gap > map;
|
|
|
|
INT r = 0;
|
|
|
|
INT mask;
|
|
|
|
for ( int i = 0; i < sizeof(INT)*8; i++ )
|
|
{
|
|
mask = 1 << map[i];
|
|
if ( s & mask )
|
|
r |= ( 1 << i );
|
|
}
|
|
|
|
return r;
|
|
}
|