summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2022-06-07 16:29:27 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2022-06-07 16:29:27 +0700
commit1791f82605ad48a1ecdedff316ed9c309058c2bc (patch)
treea4b181ade4ddef8c4c3ae5000e6c2e678df8ba7c
parentbzip2 perf. opts. (diff)
downloadBouncyCastle.NET-ed25519-1791f82605ad48a1ecdedff316ed9c309058c2bc.tar.xz
Add Highest/LowestOneBit methods
-rw-r--r--crypto/src/util/Integers.cs27
-rw-r--r--crypto/src/util/Longs.cs28
2 files changed, 55 insertions, 0 deletions
diff --git a/crypto/src/util/Integers.cs b/crypto/src/util/Integers.cs
index efa437e17..00fb957aa 100644
--- a/crypto/src/util/Integers.cs
+++ b/crypto/src/util/Integers.cs
@@ -13,6 +13,33 @@ namespace Org.BouncyCastle.Utilities
             0x1F, 0x00, 0x1B, 0x01, 0x1C, 0x0D, 0x17, 0x02, 0x1D, 0x15, 0x13, 0x0E, 0x18, 0x10, 0x03, 0x07,
             0x1E, 0x1A, 0x0C, 0x16, 0x14, 0x12, 0x0F, 0x06, 0x19, 0x0B, 0x11, 0x05, 0x0A, 0x04, 0x09, 0x08 };
 
+        public static int HighestOneBit(int i)
+        {
+            return (int)HighestOneBit((uint)i);
+        }
+
+        [CLSCompliantAttribute(false)]
+        public static uint HighestOneBit(uint i)
+        {
+            i |= i >>  1;
+            i |= i >>  2;
+            i |= i >>  4;
+            i |= i >>  8;
+            i |= i >> 16;
+            return i - (i >> 1);
+        }
+
+        public static int LowestOneBit(int i)
+        {
+            return i & -i;
+        }
+
+        [CLSCompliantAttribute(false)]
+        public static uint LowestOneBit(uint i)
+        {
+            return (uint)LowestOneBit((int)i);
+        }
+
         public static int NumberOfLeadingZeros(int i)
         {
             if (i <= 0)
diff --git a/crypto/src/util/Longs.cs b/crypto/src/util/Longs.cs
index 4d675bdba..a2d7dde0f 100644
--- a/crypto/src/util/Longs.cs
+++ b/crypto/src/util/Longs.cs
@@ -15,6 +15,34 @@ namespace Org.BouncyCastle.Utilities
             0x3E, 0x33, 0x05, 0x19, 0x24, 0x27, 0x20, 0x2E, 0x3C, 0x2C, 0x2A, 0x14, 0x16, 0x39, 0x10, 0x09,
             0x32, 0x18, 0x23, 0x1F, 0x3B, 0x13, 0x38, 0x0F, 0x31, 0x1E, 0x12, 0x0E, 0x1D, 0x0D, 0x0C, 0x0B };
 
+        public static long HighestOneBit(long i)
+        {
+            return (long)HighestOneBit((ulong)i);
+        }
+
+        [CLSCompliantAttribute(false)]
+        public static ulong HighestOneBit(ulong i)
+        {
+            i |= i >>  1;
+            i |= i >>  2;
+            i |= i >>  4;
+            i |= i >>  8;
+            i |= i >> 16;
+            i |= i >> 32;
+            return i - (i >> 1);
+        }
+
+        public static long LowestOneBit(long i)
+        {
+            return i & -i;
+        }
+
+        [CLSCompliantAttribute(false)]
+        public static ulong LowestOneBit(ulong i)
+        {
+            return (ulong)LowestOneBit((long)i);
+        }
+
         public static int NumberOfLeadingZeros(long i)
         {
             int x = (int)(i >> 32), n = 0;