Lua: print integer as a binary

前端 未结 7 1872
遇见更好的自我
遇见更好的自我 2020-12-31 07:11

How can I represent integer as Binary?

so I can print 7 as 111

相关标签:
7条回答
  • 2020-12-31 07:27

    There's a faster way to do this that takes advantage of string.format, which converts numbers to base 8. It's trivial to then convert base 8 to binary.

    --create lookup table for octal to binary
    oct2bin = {
        ['0'] = '000',
        ['1'] = '001',
        ['2'] = '010',
        ['3'] = '011',
        ['4'] = '100',
        ['5'] = '101',
        ['6'] = '110',
        ['7'] = '111'
    }
    function getOct2bin(a) return oct2bin[a] end
    function convertBin(n)
        local s = string.format('%o', n)
        s = s:gsub('.', getOct2bin)
        return s
    end
    

    If you want to keep them all the same size, then do

    s = string.format('%.22o', n)
    

    Which gets you 66 bits. That's two extra bits at the end, since octal works in groups of 3 bits, and 64 isn't divisible by 3. If you want 33 bits, change it to 11.

    If you have the BitOp library, which is available by default in LuaJIT, then you can do this:

    function convertBin(n)
        local t = {}
        for i = 1, 32 do
            n = bit.rol(n, 1)
            table.insert(t, bit.band(n, 1))
        end
        return table.concat(t)
    end
    

    But note this only does the first 32 bits! If your number is larger than 2^32, the result wont' be correct.

    0 讨论(0)
  • 2020-12-31 07:28

    This maybe not work in lua that has no bit32 library

        function toBinary(number, bits)
            local bin = {}
            bits = bits - 1
            while bits >= 0 do --As bit32.extract(1, 0) will return number 1 and bit32.extract(1, 1) will return number 0
                           --I do this in reverse order because binary should like that
                table.insert(bin, bit32.extract(number, bits))
                bits = bits - 1
            end
            return bin
        end
        --Expected result 00000011
        print(table.concat(toBinary(3, 8)))
    

    This need at least lua 5.2 (because the code need bit32 library)

    0 讨论(0)
  • 2020-12-31 07:31
    function reverse(t)
      local nt = {} -- new table
      local size = #t + 1
      for k,v in ipairs(t) do
        nt[size - k] = v
      end
      return nt
    end
    
    function tobits(num)
        local t={}
        while num>0 do
            rest=num%2
            t[#t+1]=rest
            num=(num-rest)/2
        end
        t = reverse(t)
        return table.concat(t)
    end
    print(tobits(7))
    # 111
    print(tobits(33))
    # 100001
    print(tobits(20))
    # 10100
    
    0 讨论(0)
  • function bits(num)
        local t={}
        while num>0 do
            rest=num%2
            table.insert(t,1,rest)
            num=(num-rest)/2
        end return table.concat(t)
    end
    

    Since nobody wants to use table.insert while it's useful here

    0 讨论(0)
  • 2020-12-31 07:32

    Here is a function inspired by the accepted answer with a correct syntax which returns a table of bits in wriiten from right to left.

    num=255
    bits=8
    function toBits(num, bits)
        -- returns a table of bits
        local t={} -- will contain the bits
        for b=bits,1,-1 do
            rest=math.fmod(num,2)
            t[b]=rest
            num=(num-rest)/2
        end
        if num==0 then return t else return {'Not enough bits to represent this number'}end
    end
    bits=toBits(num, bits)
    print(table.concat(bits))
    
    >>11111111
    
    0 讨论(0)
  • 2020-12-31 07:36

    You write a function to do this.

    num=7
    function toBits(num)
        -- returns a table of bits, least significant first.
        local t={} -- will contain the bits
        while num>0 do
            rest=math.fmod(num,2)
            t[#t+1]=rest
            num=(num-rest)/2
        end
        return t
    end
    bits=toBits(num)
    print(table.concat(bits))
    

    In Lua 5.2 you've already have bitwise functions which can help you ( bit32 )


    Here is the most-significant-first version, with optional leading 0 padding to a specified number of bits:

    function toBits(num,bits)
        -- returns a table of bits, most significant first.
        bits = bits or math.max(1, select(2, math.frexp(num)))
        local t = {} -- will contain the bits        
        for b = bits, 1, -1 do
            t[b] = math.fmod(num, 2)
            num = math.floor((num - t[b]) / 2)
        end
        return t
    end
    
    0 讨论(0)
提交回复
热议问题