Отговори на тема  [ 15 мнения ] 
определяне на броя единици в двоично число 
Автор Съобщение
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение определяне на броя единици в двоично число
Колеги, извинявам се за глупавия въпрос, но не мога да намеря добро решение. Как най-ефективно може да се определи броя на единиците в поредица от 8 байта? Пъврото, което ми идва на ум е да направя масив от 256 елемента, като всеки ще съдържа броя единици на дадения индекс и така байт по байт само с индексиране ще получавам броя. Има ли по-добър начин чрез логически операции?


Пон Яну 18, 2010 1:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
Код:
const
  MASK : array[8] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
var
  rx_buffer : array[8] of byte;
  counter : byte;
  x,y : byte;

.....

  counter := 0;
  for x := 0 to 7 do
    for y := 0 to 7 do
      if (rx_buffer[x] and MASK[y]) <> 0 then
        Inc(counter);


Пон Яну 18, 2010 3:14 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение Re: определяне на броя единици в двоично число
MidNighT_SpiRiT написа:
Колеги, извинявам се за глупавия въпрос, но не мога да намеря добро решение. Как най-ефективно може да се определи броя на единиците в поредица от 8 байта? Пъврото, което ми идва на ум е да направя масив от 256 елемента, като всеки ще съдържа броя единици на дадения индекс и така байт по байт само с индексиране ще получавам броя. Има ли по-добър начин чрез логически операции?


"добро" е широко понятие и с него се занимават повече разни хуманитарии. ако имаш предвид бързо, то твоята идея е най-бързия алгоритъм, не търси по-бърз от нея. ако пък добро означава пестящо памет, то твоята идея е най-лошата, тогава се прави с шифтване/тестване.


Пон Яну 18, 2010 3:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
relsys написа:
Код:
const
  MASK : array[8] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
....


това пък защо, просто трябва да шифтваш. оооох, забравих, паскала не може да шифтва :lol: :lol:


Пон Яну 18, 2010 3:54 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
zaphod написа:
relsys написа:
Код:
const
  MASK : array[8] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
....


това пък защо, просто трябва да шифтваш. оооох, забравих, паскала не може да шифтва :lol: :lol:



хе-хе... добре де....

Код:
const
  MASK : byte = $01
var
  rx_buffer : array[8] of byte;
  counter : byte;
  x,y : byte;

.....

  counter := 0;
  for x := 0 to 7 do
    for y := 0 to 7 do
      if (rx_buffer[x] and (MASK shl y)) <> 0 then
        Inc(counter);


... но... да не мерим езиците, в случая доказахме, че програмирането по двойки е по-добрия вариант за писане на програми, и не на последно място, че Pascal не е WRITE ONLY като С, защото успя да разчетеш програмата :lol: :lol:


Пон Яну 18, 2010 4:27 pm
Профил ICQ WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пон Апр 17, 2006 1:44 pm
Мнения: 291
Мнение 
Точно C за мен е един от най-семплите и прости за четене езици. Но аз не съм критерии, защото обожавам Perl-а, който пък някои считат, че е най-лошият възможен език за разбиране(четене) :lol:


Пон Яну 18, 2010 6:59 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение 
Мерси за отговорите, сега съм спокоен, че това е решението, поне в моя случай, защото памет има много :)


Пон Яну 18, 2010 8:50 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 03, 2005 11:31 am
Мнения: 766
Местоположение: Пловдив
Мнение 
http://www.keil.com/support/docs/194.htm


Пон Яну 18, 2010 9:20 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
relsys написа:
Код:
      if (rx_buffer[x] and (MASK shl y)) <> 0 then



хм, да не мамиш нещо? аз навремето доста пишех на паскал, нямам спомен за shl. мисля че умножавах по 2 за да шифтна наляво, и делях на две за да шифтна на дясно.


Вто Яну 19, 2010 9:52 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Фев 08, 2006 3:32 pm
Мнения: 253
Местоположение: Благоевград
Мнение 
Пиша на делфи и в него си има и shl и shr.


Вто Яну 19, 2010 10:16 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Сеп 15, 2009 10:44 am
Мнения: 1034
Мнение 
zaphod написа:
хм, да не мамиш нещо? аз навремето доста пишех на паскал, нямам спомен за shl. мисля че умножавах по 2 за да шифтна наляво, и делях на две за да шифтна на дясно.

И борландските TP го имаха.


Вто Яну 19, 2010 11:19 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение 
То да не повярваш, ама го има даже и в компилатора за PIC... :lol: :lol:


Вто Яну 19, 2010 3:20 pm
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Окт 17, 2006 8:23 am
Мнения: 30
Мнение Re: определяне на броя единици в двоично число
Код:

const
  COUNT : 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);

var
  rx_buffer : array[8] of byte;
  counter : byte;
  x,y : byte;

.....

  counter := 0;
  for x := 0 to 7 do
    counter := counter + COUNT[rx_buffer[x]];




Това може и да е по-бързо.
А може и да не е :)


Вто Яну 19, 2010 9:48 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Струва ми се ще е по-добре ако се раздели байта на половинки, много по-малко памет и само малко по-бавно. Сещате се, да не го разписвам сега...


Вто Яну 19, 2010 10:24 pm
Профил ICQ
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение 
Да, наистина това може би е по-добро решение, но при мен памет колкото искаш.. :D
TheHungry мерси за линка, като гледам това са решенията на проблема.


Сря Яну 20, 2010 6:26 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни