Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 47 additions & 6 deletions csharp/Platform.Numbers/Bit[T].cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,33 +18,74 @@ public static class Bit<T> where T : INumberBase<T>, IShiftOperators<T, int, T>
private static int BitsSize = NumericType<T>.BitsSize;

/// <summary>
///
/// <para>Writes a portion of the source value into the target value at the specified bit position.</para>
/// <para>Записывает часть исходного значения в целевое значение в указанной битовой позиции.</para>
/// </summary>
/// <returns></returns>
/// <param name="target">
/// <para>The target value to write to.</para>
/// <para>Целевое значение для записи.</para>
/// </param>
/// <param name="source">
/// <para>The source value to read from.</para>
/// <para>Исходное значение для чтения.</para>
/// </param>
/// <param name="shift">
/// <para>The bit position to start writing at.</para>
/// <para>Битовая позиция для начала записи.</para>
/// </param>
/// <param name="limit">
/// <para>The number of bits to write.</para>
/// <para>Количество битов для записи.</para>
/// </param>
/// <returns>
/// <para>The target value with the specified bits updated.</para>
/// <para>Целевое значение с обновленными указанными битами.</para>
/// </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T PartialWrite(T target, T source, int shift, int limit)
{
if (shift < 0)
{
shift = 32 + shift;
shift = BitsSize + shift;
}
if (limit < 0)
{
limit = 32 + limit;
limit = BitsSize + limit;
}
var sourceMask = ~(T.MaxValue << limit) & T.MaxValue;
var targetMask = ~(sourceMask << shift);
return target & targetMask | (source & sourceMask) << shift;
}

/// <summary>
/// <para>Reads a portion of bits from the target value at the specified bit position.</para>
/// <para>Читает часть битов из целевого значения в указанной битовой позиции.</para>
/// </summary>
/// <param name="target">
/// <para>The target value to read from.</para>
/// <para>Целевое значение для чтения.</para>
/// </param>
/// <param name="shift">
/// <para>The bit position to start reading from.</para>
/// <para>Битовая позиция для начала чтения.</para>
/// </param>
/// <param name="limit">
/// <para>The number of bits to read.</para>
/// <para>Количество битов для чтения.</para>
/// </param>
/// <returns>
/// <para>The extracted bits as a value.</para>
/// <para>Извлеченные биты в виде значения.</para>
/// </returns>
public static T PartialRead(T target, int shift, int limit)
{
if (shift < 0)
{
shift = 32 + shift;
shift = BitsSize + shift;
}
if (limit < 0)
{
limit = 32 + limit;
limit = BitsSize + limit;
}
var sourceMask = ~(T.MaxValue << limit) & T.MaxValue;
var targetMask = sourceMask << shift;
Expand Down
4 changes: 2 additions & 2 deletions csharp/Platform.Numbers/Math.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public static class Math
/// </returns>
public static TLinkAddress Factorial<TLinkAddress>(TLinkAddress n) where TLinkAddress : IUnsignedNumber<TLinkAddress>, IComparisonOperators<TLinkAddress, TLinkAddress, bool>
{
if (n >= TLinkAddress.Zero && n <= TLinkAddress.CreateTruncating(MaximumCatalanIndex))
if (n >= TLinkAddress.Zero && n <= TLinkAddress.CreateTruncating(MaximumFactorialNumber))
{
return TLinkAddress.CreateTruncating(_factorials[ulong.CreateTruncating(n)]);
}
Expand Down Expand Up @@ -101,7 +101,7 @@ public static TLinkAddress Catalan<TLinkAddress>(TLinkAddress n) where TLinkAddr
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsPowerOfTwo<TLinkAddress>(TLinkAddress x) where TLinkAddress : IUnsignedNumber<TLinkAddress>, IBitwiseOperators<TLinkAddress, TLinkAddress, TLinkAddress>, IComparisonOperators<TLinkAddress, TLinkAddress, bool>
{
return (x & x - TLinkAddress.One) == TLinkAddress.Zero;
return x > TLinkAddress.Zero && (x & (x - TLinkAddress.One)) == TLinkAddress.Zero;
}
}
}
4 changes: 2 additions & 2 deletions csharp/Platform.Numbers/Platform.Numbers.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<Description>LinksPlatform's Platform.Numbers Class Library</Description>
<Copyright>Konstantin Diachenko</Copyright>
<AssemblyTitle>Platform.Numbers</AssemblyTitle>
<VersionPrefix>0.9.0</VersionPrefix>
<VersionPrefix>0.9.1</VersionPrefix>
<Authors>Konstantin Diachenko</Authors>
<TargetFramework>net8</TargetFramework>
<AssemblyName>Platform.Numbers</AssemblyName>
Expand All @@ -23,7 +23,7 @@
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<LangVersion>latest</LangVersion>
<PackageReleaseNotes>Update target framework from net7 to net8.</PackageReleaseNotes>
<PackageReleaseNotes>Fix LGTM alerts: add missing XML documentation, fix hardcoded bit size constants, fix IsPowerOfTwo method for zero values, fix incorrect MaximumCatalanIndex usage in Factorial method.</PackageReleaseNotes>
<Nullable>enable</Nullable>
</PropertyGroup>

Expand Down
Loading