Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Вход: байт. Выход: кол-во установленных битов


Автор: MacTep 10.10.2007, 14:44
Есть такая задача: написать функцию, которая принимает на вход байт и возвращает кол-во установленных в нем битов. Все хорошо, но не знаю, за что взяться... А решить нужно обязательно. Какие у кого будут идеи?

Автор: Alix 10.10.2007, 15:00
например так (не компилировал)
Код

funtion butCount(b : byte);
begin
  result := 0;
  while b > 0 do begin
    inc(result, b and 1);
    b := b shr 1;
  end;  
end;


Добавлено через 3 минуты и 7 секунд
гы, столько ошибок: "function", "bitCount", нету типа возвращаемого результата  smile 

Автор: Christoph 13.8.2009, 00:14
напишу свою функцию, может кому то на будущие пригодиться

Код

procedure CheckBit(Value: byte);
var
  i:Integer;
begin
 for i:=0 to 7 do
  begin
    if Value and (1 shl i) <> 0 then ShowMessage('1')
    else ShowMessage('0');
  end;
end;

Автор: Rrader 13.8.2009, 08:12
Christoph, весьма оригинальный подход smile 

Код

function BitCount(B: Byte): Byte;
const
  Bits: array[Byte] of Byte = (
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2,
    3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3,
    3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3,
    4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,
    3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5,
    6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4,
    4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5,
    6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,
    3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3,
    4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6,
    6, 7, 6, 7, 7, 8);
begin
  Result := Bits[B];
end;

Автор: Christoph 13.8.2009, 11:33
окей окей я исправляюсь

Код

function CheckBit(Value: byte):Integer;
var
  i:Integer;
begin
 Result:=0;
 for i:=0 to 7 do
   if Value and (1 shl i) <> 0 then Inc(Result);
end;

Автор: Alix 13.8.2009, 11:42
Christoph, тем не менее по логике, мой код будет быстрее в общем случае. Т.к. он не всегда считает все 8 бит, а останавливается на последнем единичном. На практике не знаю, все же есть проверка "test b" на равенство нулю. 
Но так или иначе табличный метод рулит и за ним не угнаться.

Автор: MetalFan 13.8.2009, 11:50
интересно, а можно ли вывести такую мат.функцию, чтобы на вход число - а на выходе кол-во бит... может какая-то закономерность есть..
т.е. я имею ввиду какой-нибудь третий метод, без цикла и без таблиц...

Автор: Snowy 13.8.2009, 12:08
Код
function BitsCount(b: Byte): Integer;
begin
  Result := (b and 128 shr 7) + (b and 64 shr 6) + (b and 32 shr 5) + (b and 16 shr 4) +
            (b and 8 shr 3) + (b and 4 shr 2) + (b and 2 shr 1) + (b and 1);
end;

Автор: MetalFan 13.8.2009, 12:30
Snowy, ну эт то понятно... а без битовых операций? вдруг есть какая-то закономерность, которую можно превратить в простую и быструю формулу)
а, забейте, эт я так, фантазирую...

Автор: Qu1nt 13.8.2009, 13:18
Log2.
Глупость написал...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)