@@ -250,14 +250,14 @@ proc `shr`*(a: Int128, b: int): Int128 =
250250 if isNegative (a):
251251 result .sdata (3 ) = - 1
252252 result .sdata (2 ) = a.sdata (3 ) shr (b and 31 )
253- result .udata [1 ] = cast [uint32 ](bitconcat (a.udata[2 ], a.udata[1 ]) shr (b and 31 ))
254- result .udata [0 ] = cast [uint32 ](bitconcat (a.udata[1 ], a.udata[0 ]) shr (b and 31 ))
253+ result .udata [1 ] = cast [uint32 ](bitconcat (a.udata[3 ], a.udata[2 ]) shr (b and 31 ))
254+ result .udata [0 ] = cast [uint32 ](bitconcat (a.udata[2 ], a.udata[1 ]) shr (b and 31 ))
255255 elif b < 96 :
256256 if isNegative (a):
257257 result .sdata (3 ) = - 1
258258 result .sdata (2 ) = - 1
259259 result .sdata (1 ) = a.sdata (3 ) shr (b and 31 )
260- result .udata [0 ] = cast [uint32 ](bitconcat (a.udata[1 ], a.udata[0 ]) shr (b and 31 ))
260+ result .udata [0 ] = cast [uint32 ](bitconcat (a.udata[3 ], a.udata[2 ]) shr (b and 31 ))
261261 else : # b < 128
262262 if isNegative (a):
263263 result .sdata (3 ) = - 1
@@ -696,3 +696,86 @@ when isMainModule:
696696 doAssert divMod (toInt128 (- mb),toInt128 ( ma)) == (toInt128 (- mb div ma), toInt128 (- mb mod ma))
697697 doAssert divMod (toInt128 ( mb),toInt128 (- ma)) == (toInt128 ( mb div - ma), toInt128 ( mb mod - ma))
698698 doAssert divMod (toInt128 (- mb),toInt128 (- ma)) == (toInt128 (- mb div - ma), toInt128 (- mb mod - ma))
699+
700+ let e = parseDecimalInt128 (" 70997106675279150998592376708984375" )
701+
702+ let strArray = [
703+ # toHex(e shr 0), toHex(e shr 1), toHex(e shr 2), toHex(e shr 3)
704+ " 000dac6d782d266a37300c32591eee37" , " 0006d636bc1693351b9806192c8f771b" , " 00036b1b5e0b499a8dcc030c9647bb8d" , " 0001b58daf05a4cd46e601864b23ddc6" ,
705+ " 0000dac6d782d266a37300c32591eee3" , " 00006d636bc1693351b9806192c8f771" , " 000036b1b5e0b499a8dcc030c9647bb8" , " 00001b58daf05a4cd46e601864b23ddc" ,
706+ " 00000dac6d782d266a37300c32591eee" , " 000006d636bc1693351b9806192c8f77" , " 0000036b1b5e0b499a8dcc030c9647bb" , " 000001b58daf05a4cd46e601864b23dd" ,
707+ " 000000dac6d782d266a37300c32591ee" , " 0000006d636bc1693351b9806192c8f7" , " 00000036b1b5e0b499a8dcc030c9647b" , " 0000001b58daf05a4cd46e601864b23d" ,
708+ " 0000000dac6d782d266a37300c32591e" , " 00000006d636bc1693351b9806192c8f" , " 000000036b1b5e0b499a8dcc030c9647" , " 00000001b58daf05a4cd46e601864b23" ,
709+ " 00000000dac6d782d266a37300c32591" , " 000000006d636bc1693351b9806192c8" , " 0000000036b1b5e0b499a8dcc030c964" , " 000000001b58daf05a4cd46e601864b2" ,
710+ " 000000000dac6d782d266a37300c3259" , " 0000000006d636bc1693351b9806192c" , " 00000000036b1b5e0b499a8dcc030c96" , " 0000000001b58daf05a4cd46e601864b" ,
711+ " 0000000000dac6d782d266a37300c325" , " 00000000006d636bc1693351b9806192" , " 000000000036b1b5e0b499a8dcc030c9" , " 00000000001b58daf05a4cd46e601864" ,
712+ " 00000000000dac6d782d266a37300c32" , " 000000000006d636bc1693351b980619" , " 0000000000036b1b5e0b499a8dcc030c" , " 000000000001b58daf05a4cd46e60186" ,
713+ " 000000000000dac6d782d266a37300c3" , " 0000000000006d636bc1693351b98061" , " 00000000000036b1b5e0b499a8dcc030" , " 0000000000001b58daf05a4cd46e6018" ,
714+ " 0000000000000dac6d782d266a37300c" , " 00000000000006d636bc1693351b9806" , " 000000000000036b1b5e0b499a8dcc03" , " 00000000000001b58daf05a4cd46e601" ,
715+ " 00000000000000dac6d782d266a37300" , " 000000000000006d636bc1693351b980" , " 0000000000000036b1b5e0b499a8dcc0" , " 000000000000001b58daf05a4cd46e60" ,
716+ " 000000000000000dac6d782d266a3730" , " 0000000000000006d636bc1693351b98" , " 00000000000000036b1b5e0b499a8dcc" , " 0000000000000001b58daf05a4cd46e6" ,
717+ " 0000000000000000dac6d782d266a373" , " 00000000000000006d636bc1693351b9" , " 000000000000000036b1b5e0b499a8dc" , " 00000000000000001b58daf05a4cd46e" ,
718+ " 00000000000000000dac6d782d266a37" , " 000000000000000006d636bc1693351b" , " 0000000000000000036b1b5e0b499a8d" , " 000000000000000001b58daf05a4cd46" ,
719+ " 000000000000000000dac6d782d266a3" , " 0000000000000000006d636bc1693351" , " 00000000000000000036b1b5e0b499a8" , " 0000000000000000001b58daf05a4cd4" ,
720+ " 0000000000000000000dac6d782d266a" , " 00000000000000000006d636bc169335" , " 000000000000000000036b1b5e0b499a" , " 00000000000000000001b58daf05a4cd" ,
721+ " 00000000000000000000dac6d782d266" , " 000000000000000000006d636bc16933" , " 0000000000000000000036b1b5e0b499" , " 000000000000000000001b58daf05a4c" ,
722+ " 000000000000000000000dac6d782d26" , " 0000000000000000000006d636bc1693" , " 00000000000000000000036b1b5e0b49" , " 0000000000000000000001b58daf05a4" ,
723+ " 0000000000000000000000dac6d782d2" , " 00000000000000000000006d636bc169" , " 000000000000000000000036b1b5e0b4" , " 00000000000000000000001b58daf05a" ,
724+ " 00000000000000000000000dac6d782d" , " 000000000000000000000006d636bc16" , " 0000000000000000000000036b1b5e0b" , " 000000000000000000000001b58daf05" ,
725+ " 000000000000000000000000dac6d782" , " 0000000000000000000000006d636bc1" , " 00000000000000000000000036b1b5e0" , " 0000000000000000000000001b58daf0" ,
726+ " 0000000000000000000000000dac6d78" , " 00000000000000000000000006d636bc" , " 000000000000000000000000036b1b5e" , " 00000000000000000000000001b58daf" ,
727+ " 00000000000000000000000000dac6d7" , " 000000000000000000000000006d636b" , " 0000000000000000000000000036b1b5" , " 000000000000000000000000001b58da" ,
728+ " 000000000000000000000000000dac6d" , " 0000000000000000000000000006d636" , " 00000000000000000000000000036b1b" , " 0000000000000000000000000001b58d" ,
729+ " 0000000000000000000000000000dac6" , " 00000000000000000000000000006d63" , " 000000000000000000000000000036b1" , " 00000000000000000000000000001b58" ,
730+ " 00000000000000000000000000000dac" , " 000000000000000000000000000006d6" , " 0000000000000000000000000000036b" , " 000000000000000000000000000001b5" ,
731+ " 000000000000000000000000000000da" , " 0000000000000000000000000000006d" , " 00000000000000000000000000000036" , " 0000000000000000000000000000001b" ,
732+ " 0000000000000000000000000000000d" , " 00000000000000000000000000000006" , " 00000000000000000000000000000003" , " 00000000000000000000000000000001" ,
733+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
734+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
735+ " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" , " 00000000000000000000000000000000" ,
736+ ]
737+
738+ for i in 0 ..< 128 :
739+ let str1 = toHex (e shr i)
740+ let str2 = strArray[i]
741+ doAssert str1 == str2
742+
743+ let strArray2 = [
744+ " 000dac6d782d266a37300c32591eee37" , " 001b58daf05a4cd46e601864b23ddc6e" , " 0036b1b5e0b499a8dcc030c9647bb8dc" , " 006d636bc1693351b9806192c8f771b8" ,
745+ " 00dac6d782d266a37300c32591eee370" , " 01b58daf05a4cd46e601864b23ddc6e0" , " 036b1b5e0b499a8dcc030c9647bb8dc0" , " 06d636bc1693351b9806192c8f771b80" ,
746+ " 0dac6d782d266a37300c32591eee3700" , " 1b58daf05a4cd46e601864b23ddc6e00" , " 36b1b5e0b499a8dcc030c9647bb8dc00" , " 6d636bc1693351b9806192c8f771b800" ,
747+ " dac6d782d266a37300c32591eee37000" , " b58daf05a4cd46e601864b23ddc6e000" , " 6b1b5e0b499a8dcc030c9647bb8dc000" , " d636bc1693351b9806192c8f771b8000" ,
748+ " ac6d782d266a37300c32591eee370000" , " 58daf05a4cd46e601864b23ddc6e0000" , " b1b5e0b499a8dcc030c9647bb8dc0000" , " 636bc1693351b9806192c8f771b80000" ,
749+ " c6d782d266a37300c32591eee3700000" , " 8daf05a4cd46e601864b23ddc6e00000" , " 1b5e0b499a8dcc030c9647bb8dc00000" , " 36bc1693351b9806192c8f771b800000" ,
750+ " 6d782d266a37300c32591eee37000000" , " daf05a4cd46e601864b23ddc6e000000" , " b5e0b499a8dcc030c9647bb8dc000000" , " 6bc1693351b9806192c8f771b8000000" ,
751+ " d782d266a37300c32591eee370000000" , " af05a4cd46e601864b23ddc6e0000000" , " 5e0b499a8dcc030c9647bb8dc0000000" , " bc1693351b9806192c8f771b80000000" ,
752+ " 782d266a37300c32591eee3700000000" , " f05a4cd46e601864b23ddc6e00000000" , " e0b499a8dcc030c9647bb8dc00000000" , " c1693351b9806192c8f771b800000000" ,
753+ " 82d266a37300c32591eee37000000000" , " 05a4cd46e601864b23ddc6e000000000" , " 0b499a8dcc030c9647bb8dc000000000" , " 1693351b9806192c8f771b8000000000" ,
754+ " 2d266a37300c32591eee370000000000" , " 5a4cd46e601864b23ddc6e0000000000" , " b499a8dcc030c9647bb8dc0000000000" , " 693351b9806192c8f771b80000000000" ,
755+ " d266a37300c32591eee3700000000000" , " a4cd46e601864b23ddc6e00000000000" , " 499a8dcc030c9647bb8dc00000000000" , " 93351b9806192c8f771b800000000000" ,
756+ " 266a37300c32591eee37000000000000" , " 4cd46e601864b23ddc6e000000000000" , " 99a8dcc030c9647bb8dc000000000000" , " 3351b9806192c8f771b8000000000000" ,
757+ " 66a37300c32591eee370000000000000" , " cd46e601864b23ddc6e0000000000000" , " 9a8dcc030c9647bb8dc0000000000000" , " 351b9806192c8f771b80000000000000" ,
758+ " 6a37300c32591eee3700000000000000" , " d46e601864b23ddc6e00000000000000" , " a8dcc030c9647bb8dc00000000000000" , " 51b9806192c8f771b800000000000000" ,
759+ " a37300c32591eee37000000000000000" , " 46e601864b23ddc6e000000000000000" , " 8dcc030c9647bb8dc000000000000000" , " 1b9806192c8f771b8000000000000000" ,
760+ " 37300c32591eee370000000000000000" , " 6e601864b23ddc6e0000000000000000" , " dcc030c9647bb8dc0000000000000000" , " b9806192c8f771b80000000000000000" ,
761+ " 7300c32591eee3700000000000000000" , " e601864b23ddc6e00000000000000000" , " cc030c9647bb8dc00000000000000000" , " 9806192c8f771b800000000000000000" ,
762+ " 300c32591eee37000000000000000000" , " 601864b23ddc6e000000000000000000" , " c030c9647bb8dc000000000000000000" , " 806192c8f771b8000000000000000000" ,
763+ " 00c32591eee370000000000000000000" , " 01864b23ddc6e0000000000000000000" , " 030c9647bb8dc0000000000000000000" , " 06192c8f771b80000000000000000000" ,
764+ " 0c32591eee3700000000000000000000" , " 1864b23ddc6e00000000000000000000" , " 30c9647bb8dc00000000000000000000" , " 6192c8f771b800000000000000000000" ,
765+ " c32591eee37000000000000000000000" , " 864b23ddc6e000000000000000000000" , " 0c9647bb8dc000000000000000000000" , " 192c8f771b8000000000000000000000" ,
766+ " 32591eee370000000000000000000000" , " 64b23ddc6e0000000000000000000000" , " c9647bb8dc0000000000000000000000" , " 92c8f771b80000000000000000000000" ,
767+ " 2591eee3700000000000000000000000" , " 4b23ddc6e00000000000000000000000" , " 9647bb8dc00000000000000000000000" , " 2c8f771b800000000000000000000000" ,
768+ " 591eee37000000000000000000000000" , " b23ddc6e000000000000000000000000" , " 647bb8dc000000000000000000000000" , " c8f771b8000000000000000000000000" ,
769+ " 91eee370000000000000000000000000" , " 23ddc6e0000000000000000000000000" , " 47bb8dc0000000000000000000000000" , " 8f771b80000000000000000000000000" ,
770+ " 1eee3700000000000000000000000000" , " 3ddc6e00000000000000000000000000" , " 7bb8dc00000000000000000000000000" , " f771b800000000000000000000000000" ,
771+ " eee37000000000000000000000000000" , " ddc6e000000000000000000000000000" , " bb8dc000000000000000000000000000" , " 771b8000000000000000000000000000" ,
772+ " ee370000000000000000000000000000" , " dc6e0000000000000000000000000000" , " b8dc0000000000000000000000000000" , " 71b80000000000000000000000000000" ,
773+ " e3700000000000000000000000000000" , " c6e00000000000000000000000000000" , " 8dc00000000000000000000000000000" , " 1b800000000000000000000000000000" ,
774+ " 37000000000000000000000000000000" , " 6e000000000000000000000000000000" , " dc000000000000000000000000000000" , " b8000000000000000000000000000000" ,
775+ " 70000000000000000000000000000000" , " e0000000000000000000000000000000" , " c0000000000000000000000000000000" , " 80000000000000000000000000000000" ,
776+ ]
777+
778+ for i in 0 ..< 128 :
779+ let str1 = toHex (e shl i)
780+ let str2 = strArray2[i]
781+ doAssert str1 == str2
0 commit comments