Jcd.BitManipulation 2.1.0

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Jcd.BitManipulation --version 2.1.0                
NuGet\Install-Package Jcd.BitManipulation -Version 2.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Jcd.BitManipulation" Version="2.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Jcd.BitManipulation --version 2.1.0                
#r "nuget: Jcd.BitManipulation, 2.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Jcd.BitManipulation as a Cake Addin
#addin nuget:?package=Jcd.BitManipulation&version=2.1.0

// Install Jcd.BitManipulation as a Cake Tool
#tool nuget:?package=Jcd.BitManipulation&version=2.1.0                

Jcd.BitManipulation

A .Net Standard 2.0 library adding syntactic sugar to your bit manipulation experience.

Performance Notes

If you read the code you'll notice a fair number of abstractions at play. These don't have a significant impact on release mode performance. In fact running on at roughly 3.5GHz to 3.8Ghz (my CPU auto-scales performance based on load.) doing the 6 chained operations at the end of the example below, but on the loop index instead of just zero, 10+e9 times completes in roughly 830-890ms in Release mode. 10+e6 iterations in debug mode completes in roughly 50-65ms.

To see how it performs on your system run the code in the Main function of the examples app.

Debug mode run:
1,000,000 iterations with 6 operations per iteration took 51.34 ms for an average of 8.56e-006 ms per operation.

Release mode run:
1,000,000,000 iterations with 6 operations per iteration took 868.58 ms for an average of 1.45e-007 ms per operation.

Examples

ushort data = 0b0000000000000000;
// turn on all the bits
data=data.SetBits(0, 16); // value is now 0b1111111111111111

// this is the equivalent as above
data=data.SetBits();

// Clear the middle 4 bits.
data=data.ClearBits(4, 8); // value is now 0b1111000000001111

// Toggle all the bits.
data=data.ToggleBits(); // value is now 0b0000111111110000

// read the upper byte
var upperByte = (byte)data.ReadBits(8, 8); // upperByte is now 0b00001111

// write 0b1011 into the upper nybble
upperByte=upperByte.StoreBits(0b1011, 4, 4); // upperByte is now 0b10111111

// chaining operations, the same steps and end results
data = 0;
data = data.SetBits(0, 16) // value is now 0b1111111111111111
    .SetBits() // this is the equivalent as above
    .ClearBits(4, 8) // value is now 0b1111000000001111
    .ToggleBits(); // value is now 0b0000111111110000

upperByte = ((byte)data.ReadBits(8, 8)) // extract the upper byte (0b00001111)
    .StoreBits(0b1011, 4, 4);// store the value in the upper 4 bits, now upperByte is now 0b10111111


## Major Version Change Log

### Version 3.0 Released

#### Breaking Changes

1. Moved BitIndexers to BitIndexers namespace.
2. Removed .ToBitIndexerXXXX extension methods. These were redundant with implicit casts.

#### New Features

1. Added numerous byte-level extension methods (to and from an array or span of bytes.)
2. Added various ByteIndexer classes to the ByteIndexers namespace.

### Version 2.1 Released

1. Added `GetBytes` and `GetByte` extension methods for intrinsic data types.
2. Added `StoreBytes` and `StoreByte` extension methods for intrinsic data types.
3. Added `LittleEndianXXXByteIndexer` classes.
4. Added `BigEndianXXXByteIndexer` classes.

### Version 2.0 Released

#### Breaking Changes from v1.x

1. Renamed `BitMask.CreateRange` to `BitMask.FromRange`.
2. Renamed `BitMask.CreateSingleBit` to `BitMask.FromSingleBit`.
3. All `StoreBit` overloads had bit and offset parameters swapped for semantic parity with `StoreBits`
4. Extension methods: `ClearBits`, `SetBits`, `StoreBits`, `ToggleBits`, `ClearBit`, `SetBit`, `StoreBit`,
   and `ToggleBit` no longer take `ref` parameters. Now they return the modified result instead of modifying
   the original variable. This gives a net benefit of being able to use fluent syntax to chain together
   bit manipulation operations.

Build, Code Stats and Nuget

GitHub Build status CodeFactor Grade

MyGet Nuget

API Documentation

API Docs

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Jcd.BitManipulation:

Package Downloads
Jcd.RichEnumerations

A .netstandard 2.0 library that provides DDD-style rich enumeration base types for both _plain old classes_ and `record` types.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
3.0.125 113 9/13/2024
3.0.124 264 8/1/2024
3.0.121 251 4/14/2024
3.0.108-alpha 157 4/14/2024
3.0.105-alpha 83 4/13/2024
3.0.102-alpha 111 4/7/2024
3.0.90-alpha 102 4/6/2024
3.0.87-alpha 96 4/2/2024
3.0.55-alpha 68 4/1/2024
3.0.32-alpha 99 3/31/2024
3.0.30-alpha 83 3/27/2024
2.4.33 110 3/31/2024
2.4.11 121 3/23/2024
2.4.0 122 3/23/2024
2.3.0 111 3/23/2024
2.2.0 125 3/17/2024
2.1.0 124 3/14/2024
2.0.5 243 3/23/2023
1.0.30 420 10/11/2021
1.0.28 332 10/11/2021

Added byte manipulation extensions.