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

package org.bouncycastle.pqc.crypto.picnic;

import org.bouncycastle.util.Integers;

class Utils
{
    protected static int numBytes(final int n) {
        return (n == 0) ? 0 : ((n - 1) / 8 + 1);
    }
    
    protected static int ceil_log2(final int n) {
        if (n == 0) {
            return 0;
        }
        return 32 - nlz(n - 1);
    }
    
    private static int nlz(int n) {
        if (n == 0) {
            return 32;
        }
        int n2 = 1;
        if (n >>> 16 == 0) {
            n2 += 16;
            n <<= 16;
        }
        if (n >>> 24 == 0) {
            n2 += 8;
            n <<= 8;
        }
        if (n >>> 28 == 0) {
            n2 += 4;
            n <<= 4;
        }
        if (n >>> 30 == 0) {
            n2 += 2;
            n <<= 2;
        }
        return n2 - (n >>> 31);
    }
    
    protected static int parity(final byte[] array, final int n) {
        byte b = array[0];
        for (int i = 1; i < n; ++i) {
            b ^= array[i];
        }
        return Integers.bitCount(b & 0xFF) & 0x1;
    }
    
    protected static int parity16(final int n) {
        return Integers.bitCount(n & 0xFFFF) & 0x1;
    }
    
    protected static int parity32(final int n) {
        return Integers.bitCount(n) & 0x1;
    }
    
    protected static void setBitInWordArray(final int[] array, final int n, final int n2) {
        setBit(array, n, n2);
    }
    
    protected static int getBitFromWordArray(final int[] array, final int n) {
        return getBit(array, n);
    }
    
    protected static byte getBit(final byte[] array, final int n) {
        return (byte)(array[n >>> 3] >>> ((n & 0x7) ^ 0x7) & 0x1);
    }
    
    protected static byte getCrumbAligned(final byte[] array, final int n) {
        final int n2 = array[n >>> 2] >>> ((n << 1 & 0x6) ^ 0x6);
        return (byte)((n2 & 0x1) << 1 | (n2 & 0x2) >> 1);
    }
    
    protected static int getBit(final int n, final int n2) {
        return n >>> (n2 ^ 0x7) & 0x1;
    }
    
    protected static int getBit(final int[] array, final int n) {
        return array[n >>> 5] >>> ((n & 0x1F) ^ 0x7) & 0x1;
    }
    
    protected static void setBit(final byte[] array, final int n, final byte b) {
        final int n2 = n >>> 3;
        final int n3 = (n & 0x7) ^ 0x7;
        array[n2] = (byte)((array[n2] & ~(1 << n3)) | b << n3);
    }
    
    protected static int setBit(int n, final int n2, final int n3) {
        final int n4 = n2 ^ 0x7;
        n &= ~(1 << n4);
        n |= n3 << n4;
        return n;
    }
    
    protected static void setBit(final int[] array, final int n, final int n2) {
        final int n3 = n >>> 5;
        final int n4 = (n & 0x1F) ^ 0x7;
        array[n3] = ((array[n3] & ~(1 << n4)) | n2 << n4);
    }
    
    protected static void zeroTrailingBits(final int[] array, final int n) {
        if ((n & 0x1F) != 0x0) {
            final int n2 = n >>> 5;
            array[n2] &= getTrailingBitsMask(n);
        }
    }
    
    protected static int getTrailingBitsMask(final int n) {
        final int n2 = n & 0xFFFFFFF8;
        int n3 = ~(-1 << n2);
        final int n4 = n & 0x7;
        if (n4 != 0) {
            n3 ^= (65280 >>> n4 & 0xFF) << n2;
        }
        return n3;
    }
}
