zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

popcountti2_test.zig (1111B) - Raw


      1 const std = @import("std");
      2 const popcount = @import("popcount.zig");
      3 const testing = std.testing;
      4 
      5 fn popcountti2Naive(a: i128) i32 {
      6     var x = a;
      7     var r: i32 = 0;
      8     while (x != 0) : (x = @as(i128, @bitCast(@as(u128, @bitCast(x)) >> 1))) {
      9         r += @as(i32, @intCast(x & 1));
     10     }
     11     return r;
     12 }
     13 
     14 fn test__popcountti2(a: i128) !void {
     15     const x = popcount.__popcountti2(a);
     16     const expected = popcountti2Naive(a);
     17     try testing.expectEqual(expected, x);
     18 }
     19 
     20 test "popcountti2" {
     21     try test__popcountti2(0);
     22     try test__popcountti2(1);
     23     try test__popcountti2(2);
     24     try test__popcountti2(@as(i128, @bitCast(@as(u128, 0xffffffff_ffffffff_ffffffff_fffffffd))));
     25     try test__popcountti2(@as(i128, @bitCast(@as(u128, 0xffffffff_ffffffff_ffffffff_fffffffe))));
     26     try test__popcountti2(@as(i128, @bitCast(@as(u128, 0xffffffff_ffffffff_ffffffff_ffffffff))));
     27 
     28     const RndGen = std.Random.DefaultPrng;
     29     var rnd = RndGen.init(42);
     30     var i: u32 = 0;
     31     while (i < 10_000) : (i += 1) {
     32         const rand_num = rnd.random().int(i128);
     33         try test__popcountti2(rand_num);
     34     }
     35 }