100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			V
		
	
	
| import math.unsigned
 | |
| 
 | |
| fn test_str() {
 | |
| 	x := unsigned.uint128_from_dec_str('170141183460469231713240559642174554112') or { panic('') }
 | |
| 	assert x.str() == '170141183460469231713240559642174554112'
 | |
| 	y := unsigned.uint128_from_64(42)
 | |
| 	assert y.str() == '42'
 | |
| }
 | |
| 
 | |
| fn test_ops() {
 | |
| 	x := unsigned.uint128_from_64(18446744073709551615)
 | |
| 	y := unsigned.uint128_from_64(18446744073709551615)
 | |
| 	z := unsigned.uint128_from_dec_str('340282366920938463426481119284349108225') or {
 | |
| 		assert false
 | |
| 		panic('')
 | |
| 	}
 | |
| 	assert (x * y).str() == '340282366920938463426481119284349108225'
 | |
| 	assert (x + y).str() == '36893488147419103230'
 | |
| 	assert (z / unsigned.uint128_from_64(2)).str() == '170141183460469231713240559642174554112'
 | |
| 	assert (unsigned.uint128_from_dec_str('170141183460469231713240559642174554112') or {
 | |
| 		panic('')
 | |
| 	} - unsigned.uint128_from_64(2)).str() == '170141183460469231713240559642174554110'
 | |
| 
 | |
| 	assert x == y
 | |
| 	assert unsigned.uint128_from_dec_str('340282366920938463426481119284349108225') or {
 | |
| 		assert false
 | |
| 		panic('')
 | |
| 	} > y
 | |
| }
 | |
| 
 | |
| struct LeadingZeros {
 | |
| 	l     unsigned.Uint128
 | |
| 	r     unsigned.Uint128
 | |
| 	zeros int
 | |
| }
 | |
| 
 | |
| fn new(x u64, y u64) unsigned.Uint128 {
 | |
| 	return unsigned.Uint128{x, y}
 | |
| }
 | |
| 
 | |
| fn test_leading_zeros() {
 | |
| 	tcs := [
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0xf000000000000000)
 | |
| 			r: new(0x00, 0x8000000000000000)
 | |
| 			zeros: 1
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0xf000000000000000)
 | |
| 			r: new(0x00, 0xc000000000000000)
 | |
| 			zeros: 2
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0xf000000000000000)
 | |
| 			r: new(0x00, 0xe000000000000000)
 | |
| 			zeros: 3
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0xffff000000000000)
 | |
| 			r: new(0x00, 0xff00000000000000)
 | |
| 			zeros: 8
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0x000000000000ffff)
 | |
| 			r: new(0x00, 0x000000000000ff00)
 | |
| 			zeros: 56
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0xf000000000000000, 0x01)
 | |
| 			r: new(0x4000000000000000, 0x00)
 | |
| 			zeros: 63
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0xf000000000000000, 0x00)
 | |
| 			r: new(0x4000000000000000, 0x00)
 | |
| 			zeros: 64
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0xf000000000000000, 0x00)
 | |
| 			r: new(0x8000000000000000, 0x00)
 | |
| 			zeros: 65
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x00, 0x00)
 | |
| 			r: new(0x00, 0x00)
 | |
| 			zeros: 128
 | |
| 		},
 | |
| 		LeadingZeros{
 | |
| 			l: new(0x01, 0x00)
 | |
| 			r: new(0x00, 0x00)
 | |
| 			zeros: 127
 | |
| 		},
 | |
| 	]
 | |
| 
 | |
| 	for tc in tcs {
 | |
| 		zeros := tc.l.xor(tc.r).leading_zeros()
 | |
| 		assert zeros == tc.zeros
 | |
| 	}
 | |
| }
 |