Skip to content

Commit

Permalink
Shifting >= 128 loops (#54)
Browse files Browse the repository at this point in the history
i.e. n mod 128, so 128 shifts 0, 129 shifts 1 etc
  • Loading branch information
mattmook authored Jun 13, 2024
1 parent 1ed1965 commit e723c9e
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ internal fun uint128DivMod(dividend: UInt128, divisor: UInt128): Pair<UInt128, U

@Suppress("ReturnCount")
internal fun uint128Shl(v: UInt128, n: Int): UInt128 {
val n = n and 0b1111111
if (n == 0) {
return v
} else if (n >= UInt128.SIZE_BITS || n <= -UInt128.SIZE_BITS) {
Expand All @@ -125,6 +126,7 @@ internal fun uint128Shl(v: UInt128, n: Int): UInt128 {

@Suppress("ReturnCount")
internal fun uint128Shr(v: UInt128, n: Int): UInt128 {
val n = n and 0b1111111
if (n == 0) {
return v
} else if (n >= UInt128.SIZE_BITS || n <= -UInt128.SIZE_BITS) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,9 @@ class UInt128Test {
assertEquals(UInt128(ULong.MAX_VALUE, ULong.MAX_VALUE - 1u), MAX_VALUE shl 1)
assertEquals(UInt128(0uL, 2uL), ONE shl 1)
assertEquals(UInt128(1uL, 0uL), UInt128(0uL, (1uL shl (ULong.SIZE_BITS - 1))) shl 1)
assertEquals(ZERO, ONE shl UInt128.SIZE_BITS)
assertEquals(ZERO, ONE shl -UInt128.SIZE_BITS)
assertEquals(ONE, 2u.toUInt128() shl -1)
assertEquals(ONE, ONE shl UInt128.SIZE_BITS)
assertEquals(ONE, ONE shl -UInt128.SIZE_BITS)
assertEquals((2uL shl -1).toUInt128(), 2u.toUInt128() shl -1)

for (i in 0 until 64) {
assertEquals((1uL shl i).toUInt128(), ONE shl i)
Expand All @@ -279,9 +279,9 @@ class UInt128Test {
assertEquals(ZERO, ONE shr 1)
assertEquals(ONE, UInt128(0uL, 2uL) shr 1)
assertEquals(UInt128(0uL, 0x8000000000000000uL), UInt128(1uL, 0uL) shr 1)
assertEquals(ZERO, highBit shr UInt128.SIZE_BITS)
assertEquals(ZERO, highBit shr -UInt128.SIZE_BITS)
assertEquals(2u.toUInt128(), ONE shr -1)
assertEquals(highBit, highBit shr UInt128.SIZE_BITS)
assertEquals(highBit, highBit shr -UInt128.SIZE_BITS)
assertEquals((1uL shr -1).toUInt128(), ONE shr -1)

val value = ULong.MAX_VALUE.toUInt128()
for (i in 0 until 64) {
Expand Down

0 comments on commit e723c9e

Please sign in to comment.