142 {
143 constexpr T mask16 = T(0x0000ffff0000ffff),
144 mask8 = T(0x00ff00ff00ff00ff) ,
145 mask4 = T(0x0f0f0f0f0f0f0f0f) ,
146 mask2 = T(0x3333333333333333) ,
147 mask1 = T(0x5555555555555555) ;
148 T ret1 = x & mask1, ret2 = (x >> 1) & mask1;
149 ret1 = (ret1 ^ (ret1 >> 1)) & mask2;
150 ret2 = (ret2 ^ (ret2 >> 1)) & mask2;
151 ret1 = (ret1 ^ (ret1 >> 2)) & mask4;
152 ret2 = (ret2 ^ (ret2 >> 2)) & mask4;
153 if(sizeof(T) >= 2)
154 {
155 ret1 = (ret1 ^ (ret1 >> 4)) & mask8;
156 ret2 = (ret2 ^ (ret2 >> 4)) & mask8;
157 }
158 if(sizeof(T) >= 4)
159 {
160 ret1 = (ret1 ^ (ret1 >> 8)) & mask16;
161 ret2 = (ret2 ^ (ret2 >> 8)) & mask16;
162 }
163 if(sizeof(T) >= 8)
164 {
165 ret1 = (ret1 ^ (ret1 >> 16)) ;
166 ret2 = (ret2 ^ (ret2 >> 16)) ;
167 }
168 return bit_deinterleave_result<R>{R(ret1), R(ret2)};
169 }