Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вход: байт. Выход: кол-во установленных битов, как подойти к проблеме? 
:(
    Опции темы
MacTep
Дата 10.10.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



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


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Alix
Дата 10.10.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



например так (не компилировал)
Код

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 


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Christoph
Дата 13.8.2009, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



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

Код

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;



--------------------
user posted image
PM MAIL ICQ   Вверх
Rrader
  Дата 13.8.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



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;



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Christoph
Дата 13.8.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



окей окей я исправляюсь

Код

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;



--------------------
user posted image
PM MAIL ICQ   Вверх
Alix
Дата 13.8.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 13.8.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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

Это сообщение отредактировал(а) MetalFan - 13.8.2009, 11:50


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Snowy
Дата 13.8.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Код
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;

PM MAIL   Вверх
MetalFan
Дата 13.8.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Qu1nt
Дата 13.8.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Log2.
Глупость написал...

Это сообщение отредактировал(а) Qu1nt - 13.8.2009, 14:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.