using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine; namespace XericLibrary.Runtime.MacroLibrary { /// /// 数学库 /// public static partial class MacroMath { #region 随机 /// /// 哈希后处理 /// /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong MurmurFinalize(ulong index) { index ^= index >> 33; index *= 0xff51afd7ed558ccd; index ^= index >> 33; index *= 0xc4ceb9fe1a85ec53; index ^= index >> 33; return index; } /// /// 大范围随机 /// /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong RandomNumber(ulong index) { index *= 1103515245; index += 12345; index *= 6364136223846793005UL; index += 1442695040888963407UL; index %= 18446744073709551615UL; return index; } #endregion #region 数学 /// /// pmod /// /// /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double PMod(double a, double b) { double z = a % b; double w = (z < 0) ? -1 : 1; z = (z < 0) ? -z : z; if(w < 0) return b - z; else return z; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float MinPositive(float a, float b) => Math.Min(Math.Max(0, a), Math.Max(0, b)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int MinPositive(int a, int b) => Math.Min(Math.Max(0, a), Math.Max(0, b)); #endregion #region 字节控制 /// /// 设置字 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetByteState(ref int target, int site, bool state) { if(state) target |= 1 << site; else target &= 0xff - (1 << site); } /// /// 设置字 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SetByteState(ref int target, Enum site, bool state) { SetByteState(ref target, Convert.ToInt32(site), state); } /// /// 检查字 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool GetByteState(int target, int site) { return (target >> site & 0x01) > 0; } /// /// 检查字 /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool GetByteState(int target, Enum site) { return GetByteState(target, Convert.ToInt32(site)); } #endregion } }