github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/testdata/lua-5.3.3-tests/bitwise.lua (about)

     1  -- $Id: bitwise.lua,v 1.25 2015/04/30 14:15:57 roberto Exp $
     2  
     3  print("testing bitwise operations")
     4  
     5  local numbits = string.packsize('j') * 8
     6  
     7  assert(~0 == -1)
     8  
     9  assert((1 << (numbits - 1)) == math.mininteger)
    10  
    11  -- basic tests for bitwise operators;
    12  -- use variables to avoid constant folding
    13  local a, b, c, d
    14  a = 0xFFFFFFFFFFFFFFFF
    15  assert(a == -1 and a & -1 == a and a & 35 == 35)
    16  a = 0xF0F0F0F0F0F0F0F0
    17  assert(a | -1 == -1)
    18  assert(a ~ a == 0 and a ~ 0 == a and a ~ ~a == -1)
    19  assert(a >> 4 == ~a)
    20  a = 0xF0; b = 0xCC; c = 0xAA; d = 0xFD
    21  assert(a | b ~ c & d == 0xF4)
    22  
    23  a = 0xF0.0; b = 0xCC.0; c = "0xAA.0"; d = "0xFD.0"
    24  assert(a | b ~ c & d == 0xF4)
    25  
    26  a = 0xF0000000; b = 0xCC000000;
    27  c = 0xAA000000; d = 0xFD000000
    28  assert(a | b ~ c & d == 0xF4000000)
    29  assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1)
    30  
    31  a = a << 32
    32  b = b << 32
    33  c = c << 32
    34  d = d << 32
    35  assert(a | b ~ c & d == 0xF4000000 << 32)
    36  assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1)
    37  
    38  assert(-1 >> 1 == (1 << (numbits - 1)) - 1 and 1 << 31 == 0x80000000)
    39  assert(-1 >> (numbits - 1) == 1)
    40  assert(-1 >> numbits == 0 and
    41         -1 >> -numbits == 0 and
    42         -1 << numbits == 0 and
    43         -1 << -numbits == 0)
    44  
    45  assert((2^30 - 1) << 2^30 == 0)
    46  assert((2^30 - 1) >> 2^30 == 0)
    47  
    48  assert(1 >> -3 == 1 << 3 and 1000 >> 5 == 1000 << -5)
    49  
    50  
    51  -- coercion from strings to integers
    52  assert("0xffffffffffffffff" | 0 == -1)
    53  assert("0xfffffffffffffffe" & "-1" == -2)
    54  assert(" \t-0xfffffffffffffffe\n\t" & "-1" == 2)
    55  assert("   \n  -45  \t " >> "  -2  " == -45 * 4)
    56  
    57  -- out of range number
    58  -- TODO or spec
    59  -- assert(not pcall(function () return "0xffffffffffffffff.0" | 0 end))
    60  
    61  -- embedded zeros
    62  assert(not pcall(function () return "0xffffffffffffffff\0" | 0 end))
    63  
    64  print'+'
    65  
    66  
    67  package.preload.bit32 = function ()     --{
    68  
    69  -- no built-in 'bit32' library: implement it using bitwise operators
    70  
    71  local bit = {}
    72  
    73  function bit.bnot (a)
    74    return ~a & 0xFFFFFFFF
    75  end
    76  
    77  
    78  --
    79  -- in all vararg functions, avoid creating 'arg' table when there are
    80  -- only 2 (or less) parameters, as 2 parameters is the common case
    81  --
    82  
    83  function bit.band (x, y, z, ...)
    84    if not z then
    85      return ((x or -1) & (y or -1)) & 0xFFFFFFFF
    86    else
    87      local arg = {...}
    88      local res = x & y & z
    89      for i = 1, #arg do res = res & arg[i] end
    90      return res & 0xFFFFFFFF
    91    end
    92  end
    93  
    94  function bit.bor (x, y, z, ...)
    95    if not z then
    96      return ((x or 0) | (y or 0)) & 0xFFFFFFFF
    97    else
    98      local arg = {...}
    99      local res = x | y | z
   100      for i = 1, #arg do res = res | arg[i] end
   101      return res & 0xFFFFFFFF
   102    end
   103  end
   104  
   105  function bit.bxor (x, y, z, ...)
   106    if not z then
   107      return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF
   108    else
   109      local arg = {...}
   110      local res = x ~ y ~ z
   111      for i = 1, #arg do res = res ~ arg[i] end
   112      return res & 0xFFFFFFFF
   113    end
   114  end
   115  
   116  function bit.btest (...)
   117    return bit.band(...) ~= 0
   118  end
   119  
   120  function bit.lshift (a, b)
   121    return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF
   122  end
   123  
   124  function bit.rshift (a, b)
   125    return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF
   126  end
   127  
   128  function bit.arshift (a, b)
   129    a = a & 0xFFFFFFFF
   130    if b <= 0 or (a & 0x80000000) == 0 then
   131      return (a >> b) & 0xFFFFFFFF
   132    else
   133      return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF
   134    end
   135  end
   136  
   137  function bit.lrotate (a ,b)
   138    b = b & 31
   139    a = a & 0xFFFFFFFF
   140    a = (a << b) | (a >> (32 - b))
   141    return a & 0xFFFFFFFF
   142  end
   143  
   144  function bit.rrotate (a, b)
   145    return bit.lrotate(a, -b)
   146  end
   147  
   148  local function checkfield (f, w)
   149    w = w or 1
   150    assert(f >= 0, "field cannot be negative")
   151    assert(w > 0, "width must be positive")
   152    assert(f + w <= 32, "trying to access non-existent bits")
   153    return f, ~(-1 << w)
   154  end
   155  
   156  function bit.extract (a, f, w)
   157    local f, mask = checkfield(f, w)
   158    return (a >> f) & mask
   159  end
   160  
   161  function bit.replace (a, v, f, w)
   162    local f, mask = checkfield(f, w)
   163    v = v & mask
   164    a = (a & ~(mask << f)) | (v << f)
   165    return a & 0xFFFFFFFF
   166  end
   167  
   168  return bit
   169  
   170  end  --}
   171  
   172  
   173  print("testing bitwise library")
   174  
   175  local bit32 = require'bit32'
   176  
   177  assert(bit32.band() == bit32.bnot(0))
   178  assert(bit32.btest() == true)
   179  assert(bit32.bor() == 0)
   180  assert(bit32.bxor() == 0)
   181  
   182  assert(bit32.band() == bit32.band(0xffffffff))
   183  assert(bit32.band(1,2) == 0)
   184  
   185  
   186  -- out-of-range numbers
   187  assert(bit32.band(-1) == 0xffffffff)
   188  assert(bit32.band((1 << 33) - 1) == 0xffffffff)
   189  assert(bit32.band(-(1 << 33) - 1) == 0xffffffff)
   190  assert(bit32.band((1 << 33) + 1) == 1)
   191  assert(bit32.band(-(1 << 33) + 1) == 1)
   192  assert(bit32.band(-(1 << 40)) == 0)
   193  assert(bit32.band(1 << 40) == 0)
   194  assert(bit32.band(-(1 << 40) - 2) == 0xfffffffe)
   195  assert(bit32.band((1 << 40) - 4) == 0xfffffffc)
   196  
   197  assert(bit32.lrotate(0, -1) == 0)
   198  assert(bit32.lrotate(0, 7) == 0)
   199  assert(bit32.lrotate(0x12345678, 0) == 0x12345678)
   200  assert(bit32.lrotate(0x12345678, 32) == 0x12345678)
   201  assert(bit32.lrotate(0x12345678, 4) == 0x23456781)
   202  assert(bit32.rrotate(0x12345678, -4) == 0x23456781)
   203  assert(bit32.lrotate(0x12345678, -8) == 0x78123456)
   204  assert(bit32.rrotate(0x12345678, 8) == 0x78123456)
   205  assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa)
   206  assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa)
   207  for i = -50, 50 do
   208    assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32))
   209  end
   210  
   211  assert(bit32.lshift(0x12345678, 4) == 0x23456780)
   212  assert(bit32.lshift(0x12345678, 8) == 0x34567800)
   213  assert(bit32.lshift(0x12345678, -4) == 0x01234567)
   214  assert(bit32.lshift(0x12345678, -8) == 0x00123456)
   215  assert(bit32.lshift(0x12345678, 32) == 0)
   216  assert(bit32.lshift(0x12345678, -32) == 0)
   217  assert(bit32.rshift(0x12345678, 4) == 0x01234567)
   218  assert(bit32.rshift(0x12345678, 8) == 0x00123456)
   219  assert(bit32.rshift(0x12345678, 32) == 0)
   220  assert(bit32.rshift(0x12345678, -32) == 0)
   221  assert(bit32.arshift(0x12345678, 0) == 0x12345678)
   222  assert(bit32.arshift(0x12345678, 1) == 0x12345678 // 2)
   223  assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2)
   224  assert(bit32.arshift(-1, 1) == 0xffffffff)
   225  assert(bit32.arshift(-1, 24) == 0xffffffff)
   226  assert(bit32.arshift(-1, 32) == 0xffffffff)
   227  assert(bit32.arshift(-1, -1) == bit32.band(-1 * 2, 0xffffffff))
   228  
   229  assert(0x12345678 << 4 == 0x123456780)
   230  assert(0x12345678 << 8 == 0x1234567800)
   231  assert(0x12345678 << -4 == 0x01234567)
   232  assert(0x12345678 << -8 == 0x00123456)
   233  assert(0x12345678 << 32 == 0x1234567800000000)
   234  assert(0x12345678 << -32 == 0)
   235  assert(0x12345678 >> 4 == 0x01234567)
   236  assert(0x12345678 >> 8 == 0x00123456)
   237  assert(0x12345678 >> 32 == 0)
   238  assert(0x12345678 >> -32 == 0x1234567800000000)
   239  
   240  print("+")
   241  -- some special cases
   242  local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555,
   243             0xffffffff, 0x7fffffff}
   244  
   245  for _, b in pairs(c) do
   246    assert(bit32.band(b) == b)
   247    assert(bit32.band(b, b) == b)
   248    assert(bit32.band(b, b, b, b) == b)
   249    assert(bit32.btest(b, b) == (b ~= 0))
   250    assert(bit32.band(b, b, b) == b)
   251    assert(bit32.band(b, b, b, ~b) == 0)
   252    assert(bit32.btest(b, b, b) == (b ~= 0))
   253    assert(bit32.band(b, bit32.bnot(b)) == 0)
   254    assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0))
   255    assert(bit32.bor(b) == b)
   256    assert(bit32.bor(b, b) == b)
   257    assert(bit32.bor(b, b, b) == b)
   258    assert(bit32.bor(b, b, 0, ~b) == 0xffffffff)
   259    assert(bit32.bxor(b) == b)
   260    assert(bit32.bxor(b, b) == 0)
   261    assert(bit32.bxor(b, b, b) == b)
   262    assert(bit32.bxor(b, b, b, b) == 0)
   263    assert(bit32.bxor(b, 0) == b)
   264    assert(bit32.bnot(b) ~= b)
   265    assert(bit32.bnot(bit32.bnot(b)) == b)
   266    assert(bit32.bnot(b) == (1 << 32) - 1 - b)
   267    assert(bit32.lrotate(b, 32) == b)
   268    assert(bit32.rrotate(b, 32) == b)
   269    assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf)))
   270    assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf)))
   271  end
   272  
   273  -- for this test, use at most 24 bits (mantissa of a single float)
   274  c = {0, 1, 2, 3, 10, 0x800000, 0xaaaaaa, 0x555555, 0xffffff, 0x7fffff}
   275  for _, b in pairs(c) do
   276    for i = -40, 40 do
   277      local x = bit32.lshift(b, i)
   278      local y = math.floor(math.fmod(b * 2.0^i, 2.0^32))
   279      assert(math.fmod(x - y, 2.0^32) == 0)
   280    end
   281  end
   282  
   283  assert(not pcall(bit32.band, {}))
   284  assert(not pcall(bit32.bnot, "a"))
   285  assert(not pcall(bit32.lshift, 45))
   286  assert(not pcall(bit32.lshift, 45, print))
   287  assert(not pcall(bit32.rshift, 45, print))
   288  
   289  print("+")
   290  
   291  
   292  -- testing extract/replace
   293  
   294  assert(bit32.extract(0x12345678, 0, 4) == 8)
   295  assert(bit32.extract(0x12345678, 4, 4) == 7)
   296  assert(bit32.extract(0xa0001111, 28, 4) == 0xa)
   297  assert(bit32.extract(0xa0001111, 31, 1) == 1)
   298  assert(bit32.extract(0x50000111, 31, 1) == 0)
   299  assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679)
   300  
   301  assert(not pcall(bit32.extract, 0, -1))
   302  assert(not pcall(bit32.extract, 0, 32))
   303  assert(not pcall(bit32.extract, 0, 0, 33))
   304  assert(not pcall(bit32.extract, 0, 31, 2))
   305  
   306  assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678)
   307  assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321)
   308  assert(bit32.replace(0, 1, 2) == 2^2)
   309  assert(bit32.replace(0, -1, 4) == 2^4)
   310  assert(bit32.replace(-1, 0, 31) == (1 << 31) - 1)
   311  assert(bit32.replace(-1, 0, 1, 2) == (1 << 32) - 7)
   312  
   313  
   314  -- testing conversion of floats
   315  
   316  assert(bit32.bor(3.0) == 3)
   317  assert(bit32.bor(-4.0) == 0xfffffffc)
   318  
   319  -- large floats and large-enough integers?
   320  if 2.0^50 < 2.0^50 + 1.0 and 2.0^50 < (-1 >> 1) then
   321    assert(bit32.bor(2.0^32 - 5.0) == 0xfffffffb)
   322    assert(bit32.bor(-2.0^32 - 6.0) == 0xfffffffa)
   323    assert(bit32.bor(2.0^48 - 5.0) == 0xfffffffb)
   324    assert(bit32.bor(-2.0^48 - 6.0) == 0xfffffffa)
   325  end
   326  
   327  print'OK'
   328