Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

определяне на броя единици в двоично число
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=7471
Страница 1 от 1

Автор:  MidNighT_SpiRiT [ Пон Яну 18, 2010 1:54 pm ]
Заглавие:  определяне на броя единици в двоично число

Колеги, извинявам се за глупавия въпрос, но не мога да намеря добро решение. Как най-ефективно може да се определи броя на единиците в поредица от 8 байта? Пъврото, което ми идва на ум е да направя масив от 256 елемента, като всеки ще съдържа броя единици на дадения индекс и така байт по байт само с индексиране ще получавам броя. Има ли по-добър начин чрез логически операции?

Автор:  relsys [ Пон Яну 18, 2010 3:14 pm ]
Заглавие: 

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

Автор:  zaphod [ Пон Яну 18, 2010 3:50 pm ]
Заглавие:  Re: определяне на броя единици в двоично число

MidNighT_SpiRiT написа:
Колеги, извинявам се за глупавия въпрос, но не мога да намеря добро решение. Как най-ефективно може да се определи броя на единиците в поредица от 8 байта? Пъврото, което ми идва на ум е да направя масив от 256 елемента, като всеки ще съдържа броя единици на дадения индекс и така байт по байт само с индексиране ще получавам броя. Има ли по-добър начин чрез логически операции?


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

Автор:  zaphod [ Пон Яну 18, 2010 3:54 pm ]
Заглавие: 

relsys написа:
Код:
const
  MASK : array[8] of byte = ($01, $02, $04, $08, $10, $20, $40, $80);
....


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

Автор:  relsys [ Пон Яну 18, 2010 4:27 pm ]
Заглавие: 

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:

Автор:  perlsite [ Пон Яну 18, 2010 6:59 pm ]
Заглавие: 

Точно C за мен е един от най-семплите и прости за четене езици. Но аз не съм критерии, защото обожавам Perl-а, който пък някои считат, че е най-лошият възможен език за разбиране(четене) :lol:

Автор:  MidNighT_SpiRiT [ Пон Яну 18, 2010 8:50 pm ]
Заглавие: 

Мерси за отговорите, сега съм спокоен, че това е решението, поне в моя случай, защото памет има много :)

Автор:  TheHungry [ Пон Яну 18, 2010 9:20 pm ]
Заглавие: 

http://www.keil.com/support/docs/194.htm

Автор:  zaphod [ Вто Яну 19, 2010 9:52 am ]
Заглавие: 

relsys написа:
Код:
      if (rx_buffer[x] and (MASK shl y)) <> 0 then



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

Автор:  vesko_hard [ Вто Яну 19, 2010 10:16 am ]
Заглавие: 

Пиша на делфи и в него си има и shl и shr.

Автор:  741 [ Вто Яну 19, 2010 11:19 am ]
Заглавие: 

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

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

Автор:  relsys [ Вто Яну 19, 2010 3:20 pm ]
Заглавие: 

То да не повярваш, ама го има даже и в компилатора за PIC... :lol: :lol:

Автор:  bontchevs [ Вто Яну 19, 2010 9:48 pm ]
Заглавие:  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]];




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

Автор:  bobyk [ Вто Яну 19, 2010 10:24 pm ]
Заглавие: 

Струва ми се ще е по-добре ако се раздели байта на половинки, много по-малко памет и само малко по-бавно. Сещате се, да не го разписвам сега...

Автор:  MidNighT_SpiRiT [ Сря Яну 20, 2010 6:26 pm ]
Заглавие: 

Да, наистина това може би е по-добро решение, но при мен памет колкото искаш.. :D
TheHungry мерси за линка, като гледам това са решенията на проблема.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/