Longs
using Org.BouncyCastle.Math.Raw;
using System;
using System.Buffers.Binary;
using System.Numerics;
namespace Org.BouncyCastle.Utilities
{
public static class Longs
{
public const int NumBits = 64;
public const int NumBytes = 8;
public static long HighestOneBit(long i)
{
return (long)HighestOneBit((ulong)i);
}
[CLSCompliant(false)]
public static ulong HighestOneBit(ulong i)
{
i |= i >> 1;
i |= i >> 2;
i |= i >> 4;
i |= i >> 8;
i |= i >> 16;
i |= i >> 32;
return i - (i >> 1);
}
public static long LowestOneBit(long i)
{
return i & -i;
}
[CLSCompliant(false)]
public static ulong LowestOneBit(ulong i)
{
return (ulong)LowestOneBit((long)i);
}
public static int NumberOfLeadingZeros(long i)
{
return BitOperations.LeadingZeroCount((ulong)i);
}
public static int NumberOfTrailingZeros(long i)
{
return BitOperations.TrailingZeroCount((ulong)i);
}
public static int PopCount(long i)
{
return PopCount((ulong)i);
}
[CLSCompliant(false)]
public static int PopCount(ulong u)
{
return BitOperations.PopCount(u);
}
public static long Reverse(long i)
{
return (long)Reverse((ulong)i);
}
[CLSCompliant(false)]
public static ulong Reverse(ulong i)
{
i = Bits.BitPermuteStepSimple(i, 6148914691236517205, 1);
i = Bits.BitPermuteStepSimple(i, 3689348814741910323, 2);
i = Bits.BitPermuteStepSimple(i, 1085102592571150095, 4);
return ReverseBytes(i);
}
public static long ReverseBytes(long i)
{
return BinaryPrimitives.ReverseEndianness(i);
}
[CLSCompliant(false)]
public static ulong ReverseBytes(ulong i)
{
return BinaryPrimitives.ReverseEndianness(i);
}
public static long RotateLeft(long i, int distance)
{
return (long)BitOperations.RotateLeft((ulong)i, distance);
}
[CLSCompliant(false)]
public static ulong RotateLeft(ulong i, int distance)
{
return BitOperations.RotateLeft(i, distance);
}
public static long RotateRight(long i, int distance)
{
return (long)BitOperations.RotateRight((ulong)i, distance);
}
[CLSCompliant(false)]
public static ulong RotateRight(ulong i, int distance)
{
return BitOperations.RotateRight(i, distance);
}
}
}