// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.math.raw;

public class Interleave
{
    private static final long M32 = 1431655765L;
    private static final long M64 = 6148914691236517205L;
    private static final long M64R = -6148914691236517206L;
    
    public static int expand8to16(int n) {
        n &= 0xFF;
        n = ((n | n << 4) & 0xF0F);
        n = ((n | n << 2) & 0x3333);
        n = ((n | n << 1) & 0x5555);
        return n;
    }
    
    public static int expand16to32(int n) {
        n &= 0xFFFF;
        n = ((n | n << 8) & 0xFF00FF);
        n = ((n | n << 4) & 0xF0F0F0F);
        n = ((n | n << 2) & 0x33333333);
        n = ((n | n << 1) & 0x55555555);
        return n;
    }
    
    public static long expand32to64(int n) {
        n = Bits.bitPermuteStep(n, 65280, 8);
        n = Bits.bitPermuteStep(n, 15728880, 4);
        n = Bits.bitPermuteStep(n, 202116108, 2);
        n = Bits.bitPermuteStep(n, 572662306, 1);
        return ((long)(n >>> 1) & 0x55555555L) << 32 | ((long)n & 0x55555555L);
    }
    
    public static void expand64To128(long n, final long[] array, final int n2) {
        n = Bits.bitPermuteStep(n, 4294901760L, 16);
        n = Bits.bitPermuteStep(n, 280375465148160L, 8);
        n = Bits.bitPermuteStep(n, 67555025218437360L, 4);
        n = Bits.bitPermuteStep(n, 868082074056920076L, 2);
        n = Bits.bitPermuteStep(n, 2459565876494606882L, 1);
        array[n2] = (n & 0x5555555555555555L);
        array[n2 + 1] = (n >>> 1 & 0x5555555555555555L);
    }
    
    public static void expand64To128(final long[] array, final int n, final int n2, final long[] array2, int n3) {
        for (int i = 0; i < n2; ++i) {
            expand64To128(array[n + i], array2, n3);
            n3 += 2;
        }
    }
    
    public static void expand64To128Rev(long n, final long[] array, final int n2) {
        n = Bits.bitPermuteStep(n, 4294901760L, 16);
        n = Bits.bitPermuteStep(n, 280375465148160L, 8);
        n = Bits.bitPermuteStep(n, 67555025218437360L, 4);
        n = Bits.bitPermuteStep(n, 868082074056920076L, 2);
        n = Bits.bitPermuteStep(n, 2459565876494606882L, 1);
        array[n2] = (n & 0xAAAAAAAAAAAAAAAAL);
        array[n2 + 1] = (n << 1 & 0xAAAAAAAAAAAAAAAAL);
    }
    
    public static int shuffle(int n) {
        n = Bits.bitPermuteStep(n, 65280, 8);
        n = Bits.bitPermuteStep(n, 15728880, 4);
        n = Bits.bitPermuteStep(n, 202116108, 2);
        n = Bits.bitPermuteStep(n, 572662306, 1);
        return n;
    }
    
    public static long shuffle(long n) {
        n = Bits.bitPermuteStep(n, 4294901760L, 16);
        n = Bits.bitPermuteStep(n, 280375465148160L, 8);
        n = Bits.bitPermuteStep(n, 67555025218437360L, 4);
        n = Bits.bitPermuteStep(n, 868082074056920076L, 2);
        n = Bits.bitPermuteStep(n, 2459565876494606882L, 1);
        return n;
    }
    
    public static int shuffle2(int n) {
        n = Bits.bitPermuteStep(n, 11141290, 7);
        n = Bits.bitPermuteStep(n, 52428, 14);
        n = Bits.bitPermuteStep(n, 15728880, 4);
        n = Bits.bitPermuteStep(n, 65280, 8);
        return n;
    }
    
    public static long shuffle2(long n) {
        n = Bits.bitPermuteStep(n, 4278255360L, 24);
        n = Bits.bitPermuteStep(n, 57421771435671756L, 6);
        n = Bits.bitPermuteStep(n, 264913582878960L, 12);
        n = Bits.bitPermuteStep(n, 723401728380766730L, 3);
        return n;
    }
    
    public static long shuffle3(long n) {
        n = Bits.bitPermuteStep(n, 47851476196393130L, 7);
        n = Bits.bitPermuteStep(n, 225176545447116L, 14);
        n = Bits.bitPermuteStep(n, 4042322160L, 28);
        return n;
    }
    
    public static int unshuffle(int n) {
        n = Bits.bitPermuteStep(n, 572662306, 1);
        n = Bits.bitPermuteStep(n, 202116108, 2);
        n = Bits.bitPermuteStep(n, 15728880, 4);
        n = Bits.bitPermuteStep(n, 65280, 8);
        return n;
    }
    
    public static long unshuffle(long n) {
        n = Bits.bitPermuteStep(n, 2459565876494606882L, 1);
        n = Bits.bitPermuteStep(n, 868082074056920076L, 2);
        n = Bits.bitPermuteStep(n, 67555025218437360L, 4);
        n = Bits.bitPermuteStep(n, 280375465148160L, 8);
        n = Bits.bitPermuteStep(n, 4294901760L, 16);
        return n;
    }
    
    public static int unshuffle2(int n) {
        n = Bits.bitPermuteStep(n, 65280, 8);
        n = Bits.bitPermuteStep(n, 15728880, 4);
        n = Bits.bitPermuteStep(n, 52428, 14);
        n = Bits.bitPermuteStep(n, 11141290, 7);
        return n;
    }
    
    public static long unshuffle2(long n) {
        n = Bits.bitPermuteStep(n, 723401728380766730L, 3);
        n = Bits.bitPermuteStep(n, 264913582878960L, 12);
        n = Bits.bitPermuteStep(n, 57421771435671756L, 6);
        n = Bits.bitPermuteStep(n, 4278255360L, 24);
        return n;
    }
    
    public static long unshuffle3(final long n) {
        return shuffle3(n);
    }
}
