Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6
1

Подсчитать количество единичных битов в массиве чисел (для Х86)

20.01.2016, 10:58. Показов 6360. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый! Очень тяжело освоить ассемблер, но сдавать как-то нужно. Если арифметическими опреациями разобралась, то эта задача поставила в тупик. Помогите, пожалуйста кто понимает (пишу в С++ с ассемблерной вставкой).

Задача.
Задан массив из 10 произвольных чисел (десятичных)
Найти количество единичных битов в этом массиве чисел.

Спасибо. Буду благодарна и за советы и за помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2016, 10:58
Ответы с готовыми решениями:

В каждом элементе массива А[10] подсчитать количество единичных битов среди разрядов с номерами от 3 до 6
В каждом элементе массива А подсчитать количество единичных битов среди разрядов с номерами от 3 до...

Подсчитать количество единичных битов в числе произвольной размерности (вставка на Assembler в Pascal)
Помогите написать программу Подсчитать количество единичных битов в числе произвольной...

Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе.
Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе....

Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе
Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе,...

8
Эксперт Hardware
Эксперт Hardware
6103 / 2347 / 390
Регистрация: 29.07.2014
Сообщений: 3,108
Записей в блоге: 4
20.01.2016, 11:04 2
..почитай про "команды работы с битами": SHL/ROL и т.п.
Берёш байт и выталкиваешь в нём биты. Если вытолкнулся 1, то увеличиваешь счётчик.., и так со-всеми байтами массива
0
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
20.01.2016, 11:12 3
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a dw 1,2,3,4,5,6,7
...
mov cx,6
xor bx,bx
for:
 mov ax,[a+cx*2] ;Берем очередной элемент
 push cx ;Готовим цикл прохода по его битам
 mov cx,16
 for2:
  test ax,1 ;сравниваем очередной бит элемента с единицей
  jne next ;Если ноль - обходим инкремент кол-ва битов
   inc bx ;иначе увеличиваем счетчик битов в ВХ на 1
  next:
  shr ax,1; Сдвигаем биты вправо, чтоб добраться до следующего бита
 loop for2
 pop cx ;Возвращаемся к следующему элементу
loop for
..
Тут выводим на экран число из ВХ - в нем будет кол-во единичных битов
С коленки, но думаю сам смысл верный
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.01.2016, 11:24 4
Hikari-тян,
проще нужно
Assembler
1
2
3
4
5
6
7
lodsw
push cx
mov cx,16
@@: shr ax,1
adc bx,0
loop @b
pop cx
3
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
20.01.2016, 11:36 5
Assembler
1
2
3
4
5
6
7
8
9
10
    mov cx,10
    lea si,mass
    cld
    xor bx,bx
@@01:   lodsw
@@02:   shr ax,1
    adc bx,0
    or  ax,ax
    jnz @002
    loop    @@01
Добавлено через 7 минут
Цитата Сообщение от Hikari Посмотреть сообщение
С коленки

mov ax,[a+cx*2]
bx, bp, si и di и без маштабирования.
3
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.01.2016, 11:46 6
можно использовать команду POPCNT r, r/m* — (Return the Count of Number of Bits Set to 1)
Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-х битных регистров
0
Хитрая блондиночка $)
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
20.01.2016, 11:52 7
Цитата Сообщение от Mikl___ Посмотреть сообщение
проще нужно
Аригато, семпай
Я не оч. по ассемблеру. Так... по мелочам...
Цитата Сообщение от Constantin Cat Посмотреть сообщение
bx, bp, si и di и без маштабирования.
Согласно, просто не сразу в голову пришло lods использовать.
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6
20.01.2016, 12:10  [ТС] 8
Спасибо всем, огромное!!!
Пойду разбираться
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
21.01.2016, 13:51 9
  1. можно немного ускорить процесс вычисления
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    mov edx,N - количество двойных слов в массиве
        lea esi,mass
        xor ebx,ebx
    @1:   lodsd    
        bsr ecx,eax <-- ищем старший ненулевой бит
        jz @3 <-- если eax=0 переходим к следующему элементу
        not ecx
        add cl,33
        shl eax,cl <-- пропускаем ненужные разряды
    @2:adc ebx,0
       shl eax,1
        jnz @2
    @3:   sub edx,1
        jnz    @1
  2. еще один вариант подсчета единичных битов
    Assembler
    1
    2
    3
    4
    5
    6
    7
    
       xor ebx,ebx <-- счетчик
       or eax,eax
       jz exit
    @@: inc ebx
       lea ecx,[eax-1]
       and eax,ecx <-- в регистре EAX циклически сбрасывается крайний справа единичный бит (проверьте сами)
       jnz @b
  3. пусть имеется массив table с 256 подсчитанными заранее числом единиц в байте, тогда
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    .data
    table db 0,1,1,2,1,2,2,2,3,1,2,2,...,7,8
    count db 0
    .code
    mov ebx,offset table
    ...
    @@: lodsb
           xlat
           add count,al
           loop @b
  4. еще один вариант
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    .data
    ...
    count dd 0
    ...
    .code
    ...
         lodsd
         mov ebx,eax
         or eax,eax
         jz exit
         shr eax,1
    @@:sub ebx,eax
         shr eax,1
         jnz @b
    exit: add count,ebx
         ...
  5. и еще один вариант
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
       mov ebx,8040201h
        mov edi,11111111h
            xor eax,eax
    .....
            lodsb        ;в 32 разрядах регистра только 8 младших 
        mul ebx    ;создаем четыре копии байта каждый со сдвигом в 1 разряд
        shrd eax,edx,3  ;удаляем ненужные биты
        and eax,edi;выделяем каждый четвертый бит
        mul edi;сложение
        shr eax,28;результат в еах
            add count,eax
  6. еще один способ
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
            lodsd
        mov ebx,eax
        shr ebx,1
        and ebx,77777777h;n=(х >> 1) & 0x77777777 Подсчет битов
        sub eax,ebx      ;x=x-n                   в 4-х битовых
            shr ebx,1          ;                       полях
        and ebx,77777777h;n=(n >> 1) & 0x77777777
        sub eax,ebx      ;x=x-n
            shr ebx,1
        and ebx,77777777h;n=(n >> 1) & 0x77777777
        sub eax,ebx      ;x=x-n
        mov ebx,eax
        shr ebx,4
        add eax,ebx
        and eax,0F0F0F0Fh;x=(x+(x >> 4))& 0xF0F0F0F вычисление сумм
        imul eax,1010101h;x=x * 0x1010101           сложение байтов
        shr eax,24
            add count,eax
идеи для 2-6 способов взяты из книги Генри Уоррена "Алгоритмические трюки для программистов"
2
21.01.2016, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2016, 13:51
Помогаю со студенческими работами здесь

Количество единичных битов
Название Размерность Тип D 16 вход C 5 ...

Сосчитать количество единичных битов в АХ
помогите решить.... Сосчитать количество единичных битов в АХ. Результат поместить в ВХ.

Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе
Здравствуйте, уважаемые мастера программирования. Нуждаюсь в вашей помощи. Написать функцию,...

Определить количество единичных битов в числе
Дано натуральное число меньше 256. Посчитать количество его единичных битов. Например, если дано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru