Печать двоичного значения вместо шестнадцатеричного [дубликата]

Использование базовой функции R aggregate:

aggregate(value ~ name, dat1, I)

# name           value.1  value.2  value.3  value.4
#1 firstName      0.4145  -0.4747   0.0659   -0.5024
#2 secondName    -0.8259   0.1669  -0.8962    0.1681
10
задан fl00r 31 January 2012 в 14:54
поделиться

5 ответов

Вы пишете функцию для этого.

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))

В Lua 5.2 у вас уже есть побитовые функции, которые могут вам помочь ( bit32 )

< hr>

Вот наиболее значимая-первая версия с дополнительным отступлением 0 до заданного количества бит:

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
5
ответ дан Dave Yarwood 22 August 2018 в 19:20
поделиться
  • 1
    у вас есть обратные биты в вашей функции, поэтому 20 вернет 00101, а не 10100 – fl00r 31 January 2012 в 15:56
  • 2
    вы не указали, хотите ли вы большого или маленького эндиана. Пример тоже не дал этого, так как 111 - палиндром;). Во всяком случае, адаптировать его легко: просто используйте nBits=ceiling(select(2,math.frexp(num))) и используйте for-loop, начиная с nBits, начиная с 1. – jpjacobs 31 January 2012 в 15:59
  • 3
    моя вина, извините, тем не менее ответ правильный и полезный, спасибо! – fl00r 31 January 2012 в 16:00
  • 4
    Я добавил к вашему ответу наиболее значимую версию. Я оставил вызов math.ceil(), потому что, насколько я могу судить, frexp всегда возвращает целое число для второго значения. Есть ли край, который я пропустил? – Phrogz 26 September 2014 в 04:45
  • 5
    Нет, действительно, согласно руководству по math.frexp , второе возвращаемое значение должно всегда быть целым. Спасибо за редактирование! – jpjacobs 29 September 2014 в 10:52

Вот функция, вдохновленная принятым ответом с правильным синтаксисом, который возвращает таблицу бит в wriiten справа налево.

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
2
ответ дан Ben 22 August 2018 в 19:20
поделиться
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

Поскольку никто не хочет использовать table.insert, пока он полезен здесь

2
ответ дан einsteinK 22 August 2018 в 19:20
поделиться
  • 1
    На самом деле использование table.insert увеличивает сложность алгоритма от O (n) до O (n ^ 2) . Выполняя то, что jpjacobs сказал в своем комментарии, сначала определите длину номера, а затем заполните массив назад, намного эффективнее. Особенно для больших чисел. Единственные изменения заключались бы в замене while num>0 do на for i=math.ceil(select(2,math.frexp(num))),1,-1 do и t[#t+1] на t[i]. – RPFeltz 23 August 2014 в 13:22
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
ответ дан fl00r 22 August 2018 в 19:20
поделиться
2
ответ дан Houshalter 22 August 2018 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: