|  | // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  | // Testing int.bitLength, int.toUnsigned and int.toSigned. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | library bit_twiddling_test; | 
|  |  | 
|  | import "package:expect/expect.dart"; | 
|  |  | 
|  | testBitLength() { | 
|  | check(int i, width) { | 
|  | Expect.equals(width, i.bitLength, '$i.bitLength ==  $width'); | 
|  | // (~i) written as (-i-1) to avoid issues with limited range of dart2js ops. | 
|  | Expect.equals(width, (-i - 1).bitLength, '(~$i).bitLength == $width'); | 
|  | } | 
|  |  | 
|  | check(0, 0); | 
|  | check(1, 1); | 
|  | check(2, 2); | 
|  | check(3, 2); | 
|  | check(4, 3); | 
|  | check(5, 3); | 
|  | check(6, 3); | 
|  | check(7, 3); | 
|  | check(8, 4); | 
|  | check(127, 7); | 
|  | check(128, 8); | 
|  | check(129, 8); | 
|  | check(2147483646, 31); | 
|  | check(2147483647, 31); | 
|  | check(2147483648, 32); | 
|  | check(2147483649, 32); | 
|  | check(4294967295, 32); | 
|  | check(4294967296, 33); | 
|  | check(0xffffffffff, 40); | 
|  | check(0xfffffffffff, 44); | 
|  | check(0xffffffffffff, 48); | 
|  | check(0x1000000000000, 49); | 
|  | check(0x1000000000001, 49); | 
|  | check(0x1ffffffffffff, 49); | 
|  | check(0x2000000000000, 50); | 
|  | check(0x2000000000001, 50); | 
|  |  | 
|  | check(0xffffffffffffff, 56); //   //# int64: ok | 
|  | check(0x7fffffffffffffff, 63); // //# int64: continued | 
|  | check(0xffffffffffffffff, 0); //  //# int64: continued | 
|  | } | 
|  |  | 
|  | testToUnsigned() { | 
|  | checkU(src, width, expected) { | 
|  | Expect.equals(expected, src.toUnsigned(width)); | 
|  | } | 
|  |  | 
|  | checkU(1, 8, 1); | 
|  | checkU(0xff, 8, 0xff); | 
|  | checkU(0xffff, 8, 0xff); | 
|  | checkU(-1, 8, 0xff); | 
|  | checkU(0xffffffff, 32, 0xffffffff); | 
|  |  | 
|  | checkU(0x7fffffff, 30, 0x3fffffff); | 
|  | checkU(0x7fffffff, 31, 0x7fffffff); | 
|  | checkU(0x7fffffff, 32, 0x7fffffff); | 
|  | checkU(0x80000000, 30, 0); | 
|  | checkU(0x80000000, 31, 0); | 
|  | checkU(0x80000000, 32, 0x80000000); | 
|  | checkU(0xffffffff, 30, 0x3fffffff); | 
|  | checkU(0xffffffff, 31, 0x7fffffff); | 
|  | checkU(0xffffffff, 32, 0xffffffff); | 
|  | checkU(0x100000000, 30, 0); | 
|  | checkU(0x100000000, 31, 0); | 
|  | checkU(0x100000000, 32, 0); | 
|  | checkU(0x1ffffffff, 30, 0x3fffffff); | 
|  | checkU(0x1ffffffff, 31, 0x7fffffff); | 
|  | checkU(0x1ffffffff, 32, 0xffffffff); | 
|  |  | 
|  | checkU(-1, 0, 0); | 
|  | checkU(0, 0, 0); | 
|  | checkU(1, 0, 0); | 
|  | checkU(2, 0, 0); | 
|  | checkU(3, 0, 0); | 
|  |  | 
|  | checkU(-1, 1, 1); | 
|  | checkU(0, 1, 0); | 
|  | checkU(1, 1, 1); | 
|  | checkU(2, 1, 0); | 
|  | checkU(3, 1, 1); | 
|  | checkU(4, 1, 0); | 
|  |  | 
|  | checkU(-1, 2, 3); | 
|  | checkU(0, 2, 0); | 
|  | checkU(1, 2, 1); | 
|  | checkU(2, 2, 2); | 
|  | checkU(3, 2, 3); | 
|  | checkU(4, 2, 0); | 
|  |  | 
|  | checkU(-1, 3, 7); | 
|  | checkU(0, 3, 0); | 
|  | checkU(1, 3, 1); | 
|  | checkU(2, 3, 2); | 
|  | checkU(3, 3, 3); | 
|  | checkU(4, 3, 4); | 
|  |  | 
|  | checkU(0x0100000000000001, 2, 1); //                   //# int64: continued | 
|  | checkU(0x0200000000000001, 60, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x0200000000000001, 59, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x0200000000000001, 58, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x0200000000000001, 57, 1); //                  //# int64: continued | 
|  |  | 
|  | checkU(0x8100000000000001, 2, 1); //                   //# int64: continued | 
|  | checkU(0x8200000000000001, 60, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x8200000000000001, 59, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x8200000000000001, 58, 0x200000000000001); //  //# int64: continued | 
|  | checkU(0x8200000000000001, 57, 1); //                  //# int64: continued | 
|  | } | 
|  |  | 
|  | testToSigned() { | 
|  | checkS(src, width, expected) { | 
|  | Expect.equals( | 
|  | expected, src.toSigned(width), '$src.toSigned($width) == $expected'); | 
|  | } | 
|  |  | 
|  | checkS(1, 8, 1); | 
|  | checkS(0xff, 8, -1); | 
|  | checkS(0xffff, 8, -1); | 
|  | checkS(-1, 8, -1); | 
|  | checkS(128, 8, -128); | 
|  | checkS(0xffffffff, 32, -1); | 
|  |  | 
|  | checkS(0x7fffffff, 30, -1); | 
|  | checkS(0x7fffffff, 31, -1); | 
|  | checkS(0x7fffffff, 32, 0x7fffffff); | 
|  | checkS(0x80000000, 30, 0); | 
|  | checkS(0x80000000, 31, 0); | 
|  | checkS(0x80000000, 32, -2147483648); | 
|  | checkS(0xffffffff, 30, -1); | 
|  | checkS(0xffffffff, 31, -1); | 
|  | checkS(0xffffffff, 32, -1); | 
|  |  | 
|  | checkS(0x100000000, 30, 0); | 
|  | checkS(0x100000000, 31, 0); | 
|  | checkS(0x100000000, 32, 0); | 
|  | checkS(0x1ffffffff, 30, -1); | 
|  | checkS(0x1ffffffff, 31, -1); | 
|  | checkS(0x1ffffffff, 32, -1); | 
|  |  | 
|  | checkS(-1, 1, -1); | 
|  | checkS(0, 1, 0); | 
|  | checkS(1, 1, -1); // The only bit is the sign bit. | 
|  | checkS(2, 1, 0); | 
|  | checkS(3, 1, -1); | 
|  | checkS(4, 1, 0); | 
|  |  | 
|  | checkS(-1, 2, -1); | 
|  | checkS(0, 2, 0); | 
|  | checkS(1, 2, 1); | 
|  | checkS(2, 2, -2); | 
|  | checkS(3, 2, -1); | 
|  | checkS(4, 2, 0); | 
|  |  | 
|  | checkS(-1, 3, -1); | 
|  | checkS(0, 3, 0); | 
|  | checkS(1, 3, 1); | 
|  | checkS(2, 3, 2); | 
|  | checkS(3, 3, 3); | 
|  | checkS(4, 3, -4); | 
|  |  | 
|  | checkS(0x0100000000000001, 2, 1); //                       //# int64: continued | 
|  | checkS(0x0200000000000001, 60, 0x200000000000001); //      //# int64: continued | 
|  | checkS(0x0200000000000001, 59, 0x200000000000001); //      //# int64: continued | 
|  | checkS(0x0200000000000001, 58, -0x200000000000000 + 1); // //# int64: continued | 
|  | checkS(0x0200000000000001, 57, 1); //                      //# int64: continued | 
|  |  | 
|  | checkS(0x8100000000000001, 2, 1); //                       //# int64: continued | 
|  | checkS(0x8200000000000001, 60, 0x200000000000001); //      //# int64: continued | 
|  | checkS(0x8200000000000001, 59, 0x200000000000001); //      //# int64: continued | 
|  | checkS(0x8200000000000001, 58, -0x200000000000000 + 1); // //# int64: continued | 
|  | checkS(0x8200000000000001, 57, 1); //                      //# int64: continued | 
|  | } | 
|  |  | 
|  | main() { | 
|  | testBitLength(); | 
|  | testToUnsigned(); | 
|  | testToSigned(); | 
|  | } |