BitUtils.cs
1 using System.Numerics; 2 3 namespace Ryujinx.Common 4 { 5 public static class BitUtils 6 { 7 public static T AlignUp<T>(T value, T size) 8 where T : IBinaryInteger<T> 9 { 10 return (value + (size - T.One)) & -size; 11 } 12 13 public static T AlignDown<T>(T value, T size) 14 where T : IBinaryInteger<T> 15 { 16 return value & -size; 17 } 18 19 public static T DivRoundUp<T>(T value, T dividend) 20 where T : IBinaryInteger<T> 21 { 22 return (value + (dividend - T.One)) / dividend; 23 } 24 25 public static int Pow2RoundUp(int value) 26 { 27 value--; 28 29 value |= (value >> 1); 30 value |= (value >> 2); 31 value |= (value >> 4); 32 value |= (value >> 8); 33 value |= (value >> 16); 34 35 return ++value; 36 } 37 38 public static int Pow2RoundDown(int value) 39 { 40 return BitOperations.IsPow2(value) ? value : Pow2RoundUp(value) >> 1; 41 } 42 43 public static long ReverseBits64(long value) 44 { 45 return (long)ReverseBits64((ulong)value); 46 } 47 48 private static ulong ReverseBits64(ulong value) 49 { 50 value = ((value & 0xaaaaaaaaaaaaaaaa) >> 1) | ((value & 0x5555555555555555) << 1); 51 value = ((value & 0xcccccccccccccccc) >> 2) | ((value & 0x3333333333333333) << 2); 52 value = ((value & 0xf0f0f0f0f0f0f0f0) >> 4) | ((value & 0x0f0f0f0f0f0f0f0f) << 4); 53 value = ((value & 0xff00ff00ff00ff00) >> 8) | ((value & 0x00ff00ff00ff00ff) << 8); 54 value = ((value & 0xffff0000ffff0000) >> 16) | ((value & 0x0000ffff0000ffff) << 16); 55 56 return (value >> 32) | (value << 32); 57 } 58 } 59 }