@@ -70,24 +70,22 @@ internal static uint Expand16to32(uint x)
70
70
internal static ulong Expand32to64 ( uint x )
71
71
{
72
72
// "shuffle" low half to even bits and high half to odd bits
73
- uint t ;
74
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF00U ; x ^= ( t ^ ( t << 8 ) ) ;
75
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F0U ; x ^= ( t ^ ( t << 4 ) ) ;
76
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0CU ; x ^= ( t ^ ( t << 2 ) ) ;
77
- t = ( x ^ ( x >> 1 ) ) & 0x22222222U ; x ^= ( t ^ ( t << 1 ) ) ;
73
+ x = Bits . BitPermuteStep ( x , 0x0000FF00U , 8 ) ;
74
+ x = Bits . BitPermuteStep ( x , 0x00F000F0U , 4 ) ;
75
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0CU , 2 ) ;
76
+ x = Bits . BitPermuteStep ( x , 0x22222222U , 1 ) ;
78
77
79
78
return ( ( x >> 1 ) & M32 ) << 32 | ( x & M32 ) ;
80
79
}
81
80
82
81
internal static void Expand64To128 ( ulong x , ulong [ ] z , int zOff )
83
82
{
84
83
// "shuffle" low half to even bits and high half to odd bits
85
- ulong t ;
86
- t = ( x ^ ( x >> 16 ) ) & 0x00000000FFFF0000UL ; x ^= ( t ^ ( t << 16 ) ) ;
87
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF000000FF00UL ; x ^= ( t ^ ( t << 8 ) ) ;
88
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F000F000F0UL ; x ^= ( t ^ ( t << 4 ) ) ;
89
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0C0C0C0C0CUL ; x ^= ( t ^ ( t << 2 ) ) ;
90
- t = ( x ^ ( x >> 1 ) ) & 0x2222222222222222UL ; x ^= ( t ^ ( t << 1 ) ) ;
84
+ x = Bits . BitPermuteStep ( x , 0x00000000FFFF0000UL , 16 ) ;
85
+ x = Bits . BitPermuteStep ( x , 0x0000FF000000FF00UL , 8 ) ;
86
+ x = Bits . BitPermuteStep ( x , 0x00F000F000F000F0UL , 4 ) ;
87
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0C0C0C0C0CUL , 2 ) ;
88
+ x = Bits . BitPermuteStep ( x , 0x2222222222222222UL , 1 ) ;
91
89
92
90
z [ zOff ] = ( x ) & M64 ;
93
91
z [ zOff + 1 ] = ( x >> 1 ) & M64 ;
@@ -97,28 +95,19 @@ internal static void Expand64To128(ulong[] xs, int xsOff, int xsLen, ulong[] zs,
97
95
{
98
96
for ( int i = 0 ; i < xsLen ; ++ i )
99
97
{
100
- // "shuffle" low half to even bits and high half to odd bits
101
- ulong x = xs [ xsOff + i ] , t ;
102
- t = ( x ^ ( x >> 16 ) ) & 0x00000000FFFF0000UL ; x ^= ( t ^ ( t << 16 ) ) ;
103
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF000000FF00UL ; x ^= ( t ^ ( t << 8 ) ) ;
104
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F000F000F0UL ; x ^= ( t ^ ( t << 4 ) ) ;
105
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0C0C0C0C0CUL ; x ^= ( t ^ ( t << 2 ) ) ;
106
- t = ( x ^ ( x >> 1 ) ) & 0x2222222222222222UL ; x ^= ( t ^ ( t << 1 ) ) ;
107
-
108
- zs [ zsOff ++ ] = ( x ) & M64 ;
109
- zs [ zsOff ++ ] = ( x >> 1 ) & M64 ;
98
+ Expand64To128 ( xs [ xsOff + i ] , zs , zsOff ) ;
99
+ zsOff += 2 ;
110
100
}
111
101
}
112
102
113
103
internal static void Expand64To128Rev ( ulong x , ulong [ ] z , int zOff )
114
104
{
115
105
// "shuffle" low half to even bits and high half to odd bits
116
- ulong t ;
117
- t = ( x ^ ( x >> 16 ) ) & 0x00000000FFFF0000UL ; x ^= ( t ^ ( t << 16 ) ) ;
118
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF000000FF00UL ; x ^= ( t ^ ( t << 8 ) ) ;
119
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F000F000F0UL ; x ^= ( t ^ ( t << 4 ) ) ;
120
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0C0C0C0C0CUL ; x ^= ( t ^ ( t << 2 ) ) ;
121
- t = ( x ^ ( x >> 1 ) ) & 0x2222222222222222UL ; x ^= ( t ^ ( t << 1 ) ) ;
106
+ x = Bits . BitPermuteStep ( x , 0x00000000FFFF0000UL , 16 ) ;
107
+ x = Bits . BitPermuteStep ( x , 0x0000FF000000FF00UL , 8 ) ;
108
+ x = Bits . BitPermuteStep ( x , 0x00F000F000F000F0UL , 4 ) ;
109
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0C0C0C0C0CUL , 2 ) ;
110
+ x = Bits . BitPermuteStep ( x , 0x2222222222222222UL , 1 ) ;
122
111
123
112
z [ zOff ] = ( x ) & M64R ;
124
113
z [ zOff + 1 ] = ( x << 1 ) & M64R ;
@@ -127,68 +116,62 @@ internal static void Expand64To128Rev(ulong x, ulong[] z, int zOff)
127
116
internal static uint Shuffle ( uint x )
128
117
{
129
118
// "shuffle" low half to even bits and high half to odd bits
130
- uint t ;
131
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF00U ; x ^= ( t ^ ( t << 8 ) ) ;
132
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F0U ; x ^= ( t ^ ( t << 4 ) ) ;
133
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0CU ; x ^= ( t ^ ( t << 2 ) ) ;
134
- t = ( x ^ ( x >> 1 ) ) & 0x22222222U ; x ^= ( t ^ ( t << 1 ) ) ;
119
+ x = Bits . BitPermuteStep ( x , 0x0000FF00U , 8 ) ;
120
+ x = Bits . BitPermuteStep ( x , 0x00F000F0U , 4 ) ;
121
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0CU , 2 ) ;
122
+ x = Bits . BitPermuteStep ( x , 0x22222222U , 1 ) ;
135
123
return x ;
136
124
}
137
125
138
126
internal static ulong Shuffle ( ulong x )
139
127
{
140
128
// "shuffle" low half to even bits and high half to odd bits
141
- ulong t ;
142
- t = ( x ^ ( x >> 16 ) ) & 0x00000000FFFF0000UL ; x ^= ( t ^ ( t << 16 ) ) ;
143
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF000000FF00UL ; x ^= ( t ^ ( t << 8 ) ) ;
144
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F000F000F0UL ; x ^= ( t ^ ( t << 4 ) ) ;
145
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0C0C0C0C0CUL ; x ^= ( t ^ ( t << 2 ) ) ;
146
- t = ( x ^ ( x >> 1 ) ) & 0x2222222222222222UL ; x ^= ( t ^ ( t << 1 ) ) ;
129
+ x = Bits . BitPermuteStep ( x , 0x00000000FFFF0000UL , 16 ) ;
130
+ x = Bits . BitPermuteStep ( x , 0x0000FF000000FF00UL , 8 ) ;
131
+ x = Bits . BitPermuteStep ( x , 0x00F000F000F000F0UL , 4 ) ;
132
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0C0C0C0C0CUL , 2 ) ;
133
+ x = Bits . BitPermuteStep ( x , 0x2222222222222222UL , 1 ) ;
147
134
return x ;
148
135
}
149
136
150
137
internal static uint Shuffle2 ( uint x )
151
138
{
152
139
// "shuffle" (twice) low half to even bits and high half to odd bits
153
- uint t ;
154
- t = ( x ^ ( x >> 7 ) ) & 0x00AA00AAU ; x ^= ( t ^ ( t << 7 ) ) ;
155
- t = ( x ^ ( x >> 14 ) ) & 0x0000CCCCU ; x ^= ( t ^ ( t << 14 ) ) ;
156
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F0U ; x ^= ( t ^ ( t << 4 ) ) ;
157
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF00U ; x ^= ( t ^ ( t << 8 ) ) ;
140
+ x = Bits . BitPermuteStep ( x , 0x00AA00AAU , 7 ) ;
141
+ x = Bits . BitPermuteStep ( x , 0x0000CCCCU , 14 ) ;
142
+ x = Bits . BitPermuteStep ( x , 0x00F000F0U , 4 ) ;
143
+ x = Bits . BitPermuteStep ( x , 0x0000FF00U , 8 ) ;
158
144
return x ;
159
145
}
160
146
161
147
internal static uint Unshuffle ( uint x )
162
148
{
163
149
// "unshuffle" even bits to low half and odd bits to high half
164
- uint t ;
165
- t = ( x ^ ( x >> 1 ) ) & 0x22222222U ; x ^= ( t ^ ( t << 1 ) ) ;
166
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0CU ; x ^= ( t ^ ( t << 2 ) ) ;
167
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F0U ; x ^= ( t ^ ( t << 4 ) ) ;
168
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF00U ; x ^= ( t ^ ( t << 8 ) ) ;
150
+ x = Bits . BitPermuteStep ( x , 0x22222222U , 1 ) ;
151
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0CU , 2 ) ;
152
+ x = Bits . BitPermuteStep ( x , 0x00F000F0U , 4 ) ;
153
+ x = Bits . BitPermuteStep ( x , 0x0000FF00U , 8 ) ;
169
154
return x ;
170
155
}
171
156
172
157
internal static ulong Unshuffle ( ulong x )
173
158
{
174
159
// "unshuffle" even bits to low half and odd bits to high half
175
- ulong t ;
176
- t = ( x ^ ( x >> 1 ) ) & 0x2222222222222222UL ; x ^= ( t ^ ( t << 1 ) ) ;
177
- t = ( x ^ ( x >> 2 ) ) & 0x0C0C0C0C0C0C0C0CUL ; x ^= ( t ^ ( t << 2 ) ) ;
178
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F000F000F0UL ; x ^= ( t ^ ( t << 4 ) ) ;
179
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF000000FF00UL ; x ^= ( t ^ ( t << 8 ) ) ;
180
- t = ( x ^ ( x >> 16 ) ) & 0x00000000FFFF0000UL ; x ^= ( t ^ ( t << 16 ) ) ;
160
+ x = Bits . BitPermuteStep ( x , 0x2222222222222222UL , 1 ) ;
161
+ x = Bits . BitPermuteStep ( x , 0x0C0C0C0C0C0C0C0CUL , 2 ) ;
162
+ x = Bits . BitPermuteStep ( x , 0x00F000F000F000F0UL , 4 ) ;
163
+ x = Bits . BitPermuteStep ( x , 0x0000FF000000FF00UL , 8 ) ;
164
+ x = Bits . BitPermuteStep ( x , 0x00000000FFFF0000UL , 16 ) ;
181
165
return x ;
182
166
}
183
167
184
168
internal static uint Unshuffle2 ( uint x )
185
169
{
186
170
// "unshuffle" (twice) even bits to low half and odd bits to high half
187
- uint t ;
188
- t = ( x ^ ( x >> 8 ) ) & 0x0000FF00U ; x ^= ( t ^ ( t << 8 ) ) ;
189
- t = ( x ^ ( x >> 4 ) ) & 0x00F000F0U ; x ^= ( t ^ ( t << 4 ) ) ;
190
- t = ( x ^ ( x >> 14 ) ) & 0x0000CCCCU ; x ^= ( t ^ ( t << 14 ) ) ;
191
- t = ( x ^ ( x >> 7 ) ) & 0x00AA00AAU ; x ^= ( t ^ ( t << 7 ) ) ;
171
+ x = Bits . BitPermuteStep ( x , 0x0000FF00U , 8 ) ;
172
+ x = Bits . BitPermuteStep ( x , 0x00F000F0U , 4 ) ;
173
+ x = Bits . BitPermuteStep ( x , 0x0000CCCCU , 14 ) ;
174
+ x = Bits . BitPermuteStep ( x , 0x00AA00AAU , 7 ) ;
192
175
return x ;
193
176
}
194
177
}
0 commit comments