public void TestSetBit() { Assert.AreEqual(one, zero.SetBit(0)); Assert.AreEqual(one, one.SetBit(0)); Assert.AreEqual(three, two.SetBit(0)); Assert.AreEqual(two, zero.SetBit(1)); Assert.AreEqual(three, one.SetBit(1)); Assert.AreEqual(two, two.SetBit(1)); // TODO Tests for setting bits in negative numbers // TODO Tests for setting extended bits for (int i = 0; i < 10; ++i) { IBigInteger n = new BigInteger(128, _random); for (int j = 0; j < 10; ++j) { int pos = _random.Next(128); IBigInteger m = n.SetBit(pos); bool test = m.ShiftRight(pos).Remainder(two).Equals(one); Assert.IsTrue(test); } } for (int i = 0; i < 100; ++i) { IBigInteger pow2 = one.ShiftLeft(i); IBigInteger minusPow2 = pow2.Negate(); Assert.AreEqual(pow2, pow2.SetBit(i)); Assert.AreEqual(minusPow2, minusPow2.SetBit(i)); IBigInteger bigI = BigInteger.ValueOf(i); IBigInteger negI = bigI.Negate(); for (int j = 0; j < 10; ++j) { string data = "i=" + i + ", j=" + j; Assert.AreEqual(bigI.Or(one.ShiftLeft(j)), bigI.SetBit(j), data); Assert.AreEqual(negI.Or(one.ShiftLeft(j)), negI.SetBit(j), data); } } }
private static string MakeOidStringFromBytes(byte[] bytes) { var objId = new StringBuilder(); long value = 0; IBigInteger bigValue = null; var first = true; for (var i = 0; i != bytes.Length; i++) { int b = bytes[i]; if (value < 0x80000000000000L) { value = value * 128 + (b & 0x7f); if ((b & 0x80) == 0) // end of number reached { if (first) { switch ((int)value / 40) { case 0: objId.Append('0'); break; case 1: objId.Append('1'); value -= 40; break; default: objId.Append('2'); value -= 80; break; } first = false; } objId.Append('.'); objId.Append(value); value = 0; } } else { if (bigValue == null) { bigValue = BigInteger.ValueOf(value); } bigValue = bigValue.ShiftLeft(7); bigValue = bigValue.Or(BigInteger.ValueOf(b & 0x7f)); if ((b & 0x80) == 0) { objId.Append('.'); objId.Append(bigValue); bigValue = null; value = 0; } } } return(objId.ToString()); }