Jcd.BitManipulation 3.0.108-alpha

Prefix Reserved
This is a prerelease version of Jcd.BitManipulation.
There is a newer version of this package available.
See the version list below for details.
dotnet add package Jcd.BitManipulation --version 3.0.108-alpha                
NuGet\Install-Package Jcd.BitManipulation -Version 3.0.108-alpha                
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="3.0.108-alpha" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Jcd.BitManipulation --version 3.0.108-alpha                
#r "nuget: Jcd.BitManipulation, 3.0.108-alpha"                
#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=3.0.108-alpha&prerelease

// Install Jcd.BitManipulation as a Cake Tool
#tool nuget:?package=Jcd.BitManipulation&version=3.0.108-alpha&prerelease                

Jcd.BitManipulation

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

GitHub MyGet Nuget

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

var finalData = data;
// 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.ClearBits();
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

// finalData 0b0000111111110000
var beByte0     = finalData.ReadByte(0, Endian.Big);              // 00001111
var leByte0     = finalData.ReadByte(0, Endian.Little);           // 11110000

var mutatedData = finalData
                 .StoreByte(0b10111111, 0, Endian.Big)
                 .StoreByte(0b01010101, 0, Endian.Little ); // lower byte is now 0b01010101
;                                                           // mutatedData is now 0b1011111101010101

var beBa = mutatedData.ToByteArray(Endian.Big); // beBa=[0b10111111, 0b01010101]

var leBa = mutatedData.ToByteArray(Endian.Little); // leBa=[0b01010101, 0b10111111]

var leBaToUInt16Le = leBa.ToUInt16(Endian.Little); // leBaToUInt16Le = 0b1011111101010101

var leBaToUInt16Be = leBa.ToUInt16(Endian.Big); // leBaToUInt16Le = 0b0101010110111111

Performance Notes

If you read the code you'll notice a fair number of abstractions and helper structs in use. These don't have a significant impact on release mode performance.

To see how it performs on your system run the code in the Main function of the examples app or run the performance benchmarks using the bash script run-benchmarks. By default it'll try to run .Net Framework 4.6.2 in addition to .Net 8.0. Just edit the script to exclude .Net Framework if your system doesn't have it installed.

The latest performance benchmarks from my machine are available at the links below:

  • BigEndianReadBytes -- Extracts bytes from various integer and floating point types as a big endian array.
  • LittleEndianReadBytes -- Extracts bytes from various integer and floating point types as a little endian array.
  • BigEndianStoreByte -- Stores a single byte in various numeric types at an index using big endian indexing.
  • LittleEndianStoreByte -- Stores a single byte in various numeric type at an index using little endian indexing.
  • BigEndianStoreBytes -- Stores a collection of bytes in various numeric types, indexing into the numeric type's location as if the memory layout were big endian. (i.e. index 0 in the collection is the most significant byte)
  • LittleEndianStoreBytes -- Stores a collection of bytes in various numeric types, indexing into the numeric type's location as if the memory layout were little endian. (i.e. index 0 in the collection is the least significant byte)

Version History

See Release Notes

Dev Notes

  1. v3.0.x-alpha development is now happening in the main branch. A release branch will be created once its ready to be released.
  2. v2.4.x development will now happen in the release/2.4 branch. Only backports from main will be accepted there.

Build and Status

Build status Quality Gate Status

Statistics

Vulnerabilities Bugs Code Smells Technical Debt

Coverage Lines of Code Duplicated Lines (%)

Ratings

CodeFactor Grade Reliability Rating Security Rating Maintainability Rating

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 is compatible. 
.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 123 9/13/2024
3.0.124 274 8/1/2024
3.0.121 253 4/14/2024
3.0.108-alpha 159 4/14/2024
3.0.105-alpha 85 4/13/2024
3.0.102-alpha 113 4/7/2024
3.0.90-alpha 104 4/6/2024
3.0.87-alpha 98 4/2/2024
3.0.55-alpha 70 4/1/2024
3.0.32-alpha 103 3/31/2024
3.0.30-alpha 85 3/27/2024
2.4.33 112 3/31/2024
2.4.11 123 3/23/2024
2.4.0 124 3/23/2024
2.3.0 113 3/23/2024
2.2.0 127 3/17/2024
2.1.0 126 3/14/2024
2.0.5 245 3/23/2023
1.0.30 424 10/11/2021
1.0.28 336 10/11/2021