Skip to content

Commit 2a5398a

Browse files
authored
math.unsigned: fix lsh() for Uint128, add tests (#24840)
1 parent 7e35d40 commit 2a5398a

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

‎vlib/math/unsigned/uint128.v‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,16 @@ pub fn (u Uint128) quo_rem(v Uint128) (Uint128, Uint128) {
300300
// lsh returns u << n
301301
pub fn (u Uint128) lsh(n u32) Uint128 {
302302
mut s := Uint128{}
303-
if n > 64 {
303+
if n == 0 {
304+
s.lo = u.lo
305+
s.hi = u.hi
306+
} else if n >= 128 {
307+
s.lo = 0
308+
s.hi = 0
309+
} else if n == 64 {
310+
s.lo = 0
311+
s.hi = u.lo
312+
} else if n > 64 {
304313
s.lo = 0
305314
s.hi = u.lo << (n - 64)
306315
} else {

‎vlib/math/unsigned/uint128_test.v‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,12 @@ fn test_separators() {
174174
fn test_new() {
175175
assert unsigned.uint128_new(max_u64, max_u64) == unsigned.uint128_max
176176
}
177+
178+
fn test_lsh() {
179+
a := unsigned.uint128_from_dec_str('123456789012345678901234567890')!
180+
assert a.str() == a.lsh(0).str()
181+
assert '246913578024691357802469135780' == a.lsh(1).str()
182+
assert '259801135457060040952792416454273138688' == a.lsh(64).str()
183+
assert '302984417681386893975453667670529933312' == a.lsh(100).str()
184+
assert unsigned.uint128_zero == a.lsh(200)
185+
}

0 commit comments

Comments
 (0)