diff --git a/ICD.Common.Utils.Tests/Extensions/ByteExtensionsTest.cs b/ICD.Common.Utils.Tests/Extensions/ByteExtensionsTest.cs index 1fd4a15..c7a5734 100644 --- a/ICD.Common.Utils.Tests/Extensions/ByteExtensionsTest.cs +++ b/ICD.Common.Utils.Tests/Extensions/ByteExtensionsTest.cs @@ -3,41 +3,53 @@ using NUnit.Framework; namespace ICD.Common.Utils.Tests.Extensions { - [TestFixture] - public sealed class ByteExtensionsTest - { - [TestCase(false, 0, 0)] - [TestCase(true, 1, 0)] - [TestCase(false, 247, 3)] - [TestCase(true, 255, 3)] - public void GetBitTest(bool expected, byte value, int index) - { - Assert.AreEqual(expected, value.GetBit(index)); - } + [TestFixture] + public sealed class ByteExtensionsTest + { + [TestCase(false, 0, 0)] + [TestCase(true, 1, 0)] + [TestCase(false, 247, 3)] + [TestCase(true, 255, 3)] + public void GetBitTest(bool expected, byte value, int index) + { + Assert.AreEqual(expected, value.GetBit(index)); + } - [TestCase(1, 0, 0, true)] - [TestCase(0, 1, 0, false)] - [TestCase(247, 255, 3, false)] - [TestCase(255, 247, 3, true)] - public void SetBitTest(byte expected, byte value, int index, bool bitValue) - { - Assert.AreEqual(expected, value.SetBit(index, bitValue)); - } + [TestCase(1, 0, 0, true)] + [TestCase(0, 1, 0, false)] + [TestCase(247, 255, 3, false)] + [TestCase(255, 247, 3, true)] + public void SetBitTest(byte expected, byte value, int index, bool bitValue) + { + Assert.AreEqual(expected, value.SetBit(index, bitValue)); + } - [TestCase(1, 0, 0)] - [TestCase(1, 1, 0)] - [TestCase(255, 247, 3)] - public void SetBitOnTest(byte expected, byte value, int index) - { - Assert.AreEqual(expected, value.SetBitOn(index)); - } + [TestCase(1, 0, 0)] + [TestCase(1, 1, 0)] + [TestCase(255, 247, 3)] + public void SetBitOnTest(byte expected, byte value, int index) + { + Assert.AreEqual(expected, value.SetBitOn(index)); + } - [TestCase(0, 0, 0)] - [TestCase(0, 1, 0)] - [TestCase(247, 255, 3)] - public void SetBitOffTest(byte expected, byte value, int index) - { - Assert.AreEqual(expected, value.SetBitOff(index)); - } - } + [TestCase(0, 0, 0)] + [TestCase(0, 1, 0)] + [TestCase(247, 255, 3)] + public void SetBitOffTest(byte expected, byte value, int index) + { + Assert.AreEqual(expected, value.SetBitOff(index)); + } + + [TestCase(0xFF, 0x0F)] + public void GetLower4BitsTest(byte b, byte expected) + { + Assert.AreEqual(expected, b.GetLower4Bits()); + } + + [TestCase(0xFF, 0xF0)] + public void GetUpper4BitsTest(byte b, byte expected) + { + Assert.AreEqual(expected, b.GetUpper4Bits()); + } + } } diff --git a/ICD.Common.Utils/Extensions/ByteExtensions.cs b/ICD.Common.Utils/Extensions/ByteExtensions.cs index 46a04fc..f424bed 100644 --- a/ICD.Common.Utils/Extensions/ByteExtensions.cs +++ b/ICD.Common.Utils/Extensions/ByteExtensions.cs @@ -7,22 +7,20 @@ namespace ICD.Common.Utils.Extensions public static bool GetBit(this byte b, int n) { if (n > 7 || n < 0) - throw new ArgumentException(); + throw new ArgumentOutOfRangeException("n"); return (b & (1 << n)) == (1 << n); } public static byte SetBit(this byte b, int n, bool v) { - if (v) - return SetBitOn(b, n); - return SetBitOff(b, n); + return v ? SetBitOn(b, n) : SetBitOff(b, n); } public static byte SetBitOn(this byte b, int n) { if (n > 7 || n < 0) - throw new ArgumentException(); + throw new ArgumentOutOfRangeException("n"); return (byte)(b | (1 << n)); } @@ -30,9 +28,19 @@ namespace ICD.Common.Utils.Extensions public static byte SetBitOff(this byte b, int n) { if (n > 7 || n < 0) - throw new ArgumentException(); + throw new ArgumentOutOfRangeException("n"); return (byte)(b & ~(1 << n)); } + + public static byte GetLower4Bits(this byte b) + { + return (byte)(b & 15); + } + + public static byte GetUpper4Bits(this byte b) + { + return (byte)(b >> 4); + } } }