Skip to content

Commit 2618a7e

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 1d0f634 + 0f23f1f commit 2618a7e

File tree

6 files changed

+113
-4
lines changed

6 files changed

+113
-4
lines changed

crypto/crypto.csproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13866,6 +13866,16 @@
1386613866
SubType = "Code"
1386713867
BuildAction = "Compile"
1386813868
/>
13869+
<File
13870+
RelPath = "test\src\util\utiltest\IntegersTest.cs"
13871+
SubType = "Code"
13872+
BuildAction = "Compile"
13873+
/>
13874+
<File
13875+
RelPath = "test\src\util\utiltest\LongsTest.cs"
13876+
SubType = "Code"
13877+
BuildAction = "Compile"
13878+
/>
1386913879
<File
1387013880
RelPath = "test\src\x509\test\TestCertificateGen.cs"
1387113881
SubType = "Code"

crypto/src/util/Integers.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ public abstract class Integers
1010
public const int NumBytes = 4;
1111

1212
private static readonly byte[] DeBruijnTZ = {
13-
0x00, 0x01, 0x02, 0x18, 0x03, 0x13, 0x06, 0x19, 0x16, 0x04, 0x14, 0x0A,
14-
0x10, 0x07, 0x0C, 0x1A, 0x1F, 0x17, 0x12, 0x05, 0x15, 0x09, 0x0F, 0x0B,
15-
0x1E, 0x11, 0x08, 0x0E, 0x1D, 0x0D, 0x1C, 0x1B };
13+
0x1F, 0x00, 0x1B, 0x01, 0x1C, 0x0D, 0x17, 0x02, 0x1D, 0x15, 0x13, 0x0E, 0x18, 0x10, 0x03, 0x07,
14+
0x1E, 0x1A, 0x0C, 0x16, 0x14, 0x12, 0x0F, 0x06, 0x19, 0x0B, 0x11, 0x05, 0x0A, 0x04, 0x09, 0x08 };
1615

1716
public static int NumberOfLeadingZeros(int i)
1817
{
@@ -31,7 +30,9 @@ public static int NumberOfLeadingZeros(int i)
3130

3231
public static int NumberOfTrailingZeros(int i)
3332
{
34-
return DeBruijnTZ[(uint)((i & -i) * 0x04D7651F) >> 27];
33+
int n = DeBruijnTZ[(uint)((i & -i) * 0x0EF96A62) >> 27];
34+
int m = (((i & 0xFFFF) | (int)((uint)i >> 16)) - 1) >> 31;
35+
return n - m;
3536
}
3637

3738
public static int Reverse(int i)

crypto/src/util/Longs.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@ public abstract class Longs
99
public const int NumBits = 64;
1010
public const int NumBytes = 8;
1111

12+
private static readonly byte[] DeBruijnTZ = {
13+
0x3F, 0x00, 0x01, 0x34, 0x02, 0x06, 0x35, 0x1A, 0x03, 0x25, 0x28, 0x07, 0x21, 0x36, 0x2F, 0x1B,
14+
0x3D, 0x04, 0x26, 0x2D, 0x2B, 0x29, 0x15, 0x08, 0x17, 0x22, 0x3A, 0x37, 0x30, 0x11, 0x1C, 0x0A,
15+
0x3E, 0x33, 0x05, 0x19, 0x24, 0x27, 0x20, 0x2E, 0x3C, 0x2C, 0x2A, 0x14, 0x16, 0x39, 0x10, 0x09,
16+
0x32, 0x18, 0x23, 0x1F, 0x3B, 0x13, 0x38, 0x0F, 0x31, 0x1E, 0x12, 0x0E, 0x1D, 0x0D, 0x0C, 0x0B };
17+
18+
public static int NumberOfLeadingZeros(long i)
19+
{
20+
int x = (int)(i >> 32), n = 0;
21+
if (x == 0)
22+
{
23+
n = 32;
24+
x = (int)i;
25+
}
26+
return n + Integers.NumberOfLeadingZeros(x);
27+
}
28+
29+
public static int NumberOfTrailingZeros(long i)
30+
{
31+
int n = DeBruijnTZ[(uint)((ulong)((i & -i) * 0x045FBAC7992A70DAL) >> 58)];
32+
long m = (((i & 0xFFFFFFFFL) | (long)((ulong)i >> 32)) - 1L) >> 63;
33+
return n - (int)m;
34+
}
35+
1236
public static long Reverse(long i)
1337
{
1438
i = (long)Bits.BitPermuteStepSimple((ulong)i, 0x5555555555555555UL, 1);

crypto/test/UnitTests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,8 @@
486486
<Compile Include="src\util\test\TestRandomBigInteger.cs" />
487487
<Compile Include="src\util\test\TestRandomData.cs" />
488488
<Compile Include="src\util\test\UncloseableStream.cs" />
489+
<Compile Include="src\util\utiltest\IntegersTest.cs" />
490+
<Compile Include="src\util\utiltest\LongsTest.cs" />
489491
<Compile Include="src\x509\test\TestCertificateGen.cs" />
490492
</ItemGroup>
491493
<ItemGroup>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
3+
using NUnit.Framework;
4+
5+
namespace Org.BouncyCastle.Utilities.UtilTests
6+
{
7+
[TestFixture]
8+
public class IntegersTest
9+
{
10+
[Test]
11+
public void TestNumberOfLeadingZeros()
12+
{
13+
for (int i = 0; i < 31; ++i)
14+
{
15+
Assert.AreEqual(i, Integers.NumberOfLeadingZeros((int)(0x80000000U >> i)));
16+
Assert.AreEqual(i, Integers.NumberOfLeadingZeros((int)(0xFFFFFFFFU >> i)));
17+
}
18+
19+
Assert.AreEqual(31, Integers.NumberOfLeadingZeros(1));
20+
Assert.AreEqual(32, Integers.NumberOfLeadingZeros(0));
21+
}
22+
23+
[Test]
24+
public void TestNumberOfTrailingZeros()
25+
{
26+
for (int i = 0; i < 31; ++i)
27+
{
28+
Assert.AreEqual(i, Integers.NumberOfTrailingZeros(1 << i));
29+
Assert.AreEqual(i, Integers.NumberOfTrailingZeros(-1 << i));
30+
}
31+
32+
Assert.AreEqual(31, Integers.NumberOfTrailingZeros(int.MinValue));
33+
Assert.AreEqual(32, Integers.NumberOfTrailingZeros(0));
34+
}
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System;
2+
3+
using NUnit.Framework;
4+
5+
namespace Org.BouncyCastle.Utilities.UtilTests
6+
{
7+
[TestFixture]
8+
public class LongsTest
9+
{
10+
[Test]
11+
public void TestNumberOfLeadingZeros()
12+
{
13+
for (int i = 0; i < 63; ++i)
14+
{
15+
Assert.AreEqual(i, Longs.NumberOfLeadingZeros((long)(0x8000000000000000UL >> i)));
16+
Assert.AreEqual(i, Longs.NumberOfLeadingZeros((long)(0xFFFFFFFFFFFFFFFFUL >> i)));
17+
}
18+
19+
Assert.AreEqual(63, Longs.NumberOfLeadingZeros(1L));
20+
Assert.AreEqual(64, Longs.NumberOfLeadingZeros(0L));
21+
}
22+
23+
[Test]
24+
public void TestNumberOfTrailingZeros()
25+
{
26+
for (int i = 0; i < 63; ++i)
27+
{
28+
Assert.AreEqual(i, Longs.NumberOfTrailingZeros(1L << i));
29+
Assert.AreEqual(i, Longs.NumberOfTrailingZeros(-1L << i));
30+
}
31+
32+
Assert.AreEqual(63, Longs.NumberOfTrailingZeros(long.MinValue));
33+
Assert.AreEqual(64, Longs.NumberOfTrailingZeros(0L));
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)