This repository has been archived on 2025-09-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
XericLibrary-OLD/Runtime/MicroLibrary/MacroMath.cs

127 lines
2.7 KiB
C#

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