Jcd.BitManipulation
2.3.0
Prefix Reserved
See the version list below for details.
dotnet add package Jcd.BitManipulation --version 2.3.0
NuGet\Install-Package Jcd.BitManipulation -Version 2.3.0
<PackageReference Include="Jcd.BitManipulation" Version="2.3.0" />
<PackageVersion Include="Jcd.BitManipulation" Version="2.3.0" />
<PackageReference Include="Jcd.BitManipulation" />
paket add Jcd.BitManipulation --version 2.3.0
#r "nuget: Jcd.BitManipulation, 2.3.0"
#:package Jcd.BitManipulation@2.3.0
#addin nuget:?package=Jcd.BitManipulation&version=2.3.0
#tool nuget:?package=Jcd.BitManipulation&version=2.3.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
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
Change Log
Version 2.3 Released
- Added an Endian parameter to
StoreByte. - Improved efficiency of
ReadBytecalls. - Fixed numerous copy and paste errors in the documentation.
- Added examples of using
StoreByteandToByteArray.
Version 2.2 Released
- Added
AreAnyBitsSetextensions methods for all intrinsic integer types. - Added
AreAllBitsSetextensions methods for all intrinsic integer types. - Added
AreNoBitsSetextensions methods for all intrinsic integer types.
Version 2.1 Released
- Added
GetBytesandGetByteextension methods for intrinsic data types. - Added
StoreBytesandStoreByteextension methods for intrinsic data types. - Added
LittleEndianXXXByteIndexerclasses. - Added
BigEndianXXXByteIndexerclasses.
Version 2.0 Released
Breaking Changes from v1.x
- Renamed
BitMask.CreateRangetoBitMask.FromRange. - Renamed
BitMask.CreateSingleBittoBitMask.FromSingleBit. - All
StoreBitoverloads had bit and offset parameters swapped for semantic parity withStoreBits - Extension methods:
ClearBits,SetBits,StoreBits,ToggleBits,ClearBit,SetBit,StoreBit, andToggleBitno longer takerefparameters. 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
API Documentation
| Product | Versions 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.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. |
-
.NETStandard 2.0
- Jcd.Netstandard20.Shim (>= 1.0.1)
- System.Memory (>= 4.5.5)
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 | 218 | 9/13/2024 |
| 3.0.124 | 426 | 8/1/2024 |
| 3.0.121 | 359 | 4/14/2024 |
| 3.0.108-alpha | 220 | 4/14/2024 |
| 3.0.105-alpha | 154 | 4/13/2024 |
| 3.0.102-alpha | 160 | 4/7/2024 |
| 3.0.90-alpha | 180 | 4/6/2024 |
| 3.0.87-alpha | 164 | 4/2/2024 |
| 3.0.55-alpha | 130 | 4/1/2024 |
| 3.0.32-alpha | 176 | 3/31/2024 |
| 3.0.30-alpha | 176 | 3/27/2024 |
| 2.4.33 | 189 | 3/31/2024 |
| 2.4.11 | 181 | 3/23/2024 |
| 2.4.0 | 186 | 3/23/2024 |
| 2.3.0 | 187 | 3/23/2024 |
| 2.2.0 | 200 | 3/17/2024 |
| 2.1.0 | 209 | 3/14/2024 |
| 2.0.5 | 373 | 3/23/2023 |
| 1.0.30 | 553 | 10/11/2021 |
| 1.0.28 | 475 | 10/11/2021 |
Added bit testing extensions.