Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
j_shchel
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6
1

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

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

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

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

Спасибо. Буду благодарна и за советы и за помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2016, 10:58
Ответы с готовыми решениями:

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

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

Посчитать количество единичных битов во введенном с клавиатуры слове
Подскажите, пожалуйста, код на masm32: посчитать количество единичных битов в...

Массив 16-битовых чисел с заданным количеством единичных битов
Здравствуйте! Требуется создать массив всех вариантов 16-битовых элементов с...

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

8
R71MT
5309 / 1470 / 313
Регистрация: 29.07.2014
Сообщений: 2,511
Записей в блоге: 5
20.01.2016, 11:04 2
..почитай про "команды работы с битами": SHL/ROL и т.п.
Берёш байт и выталкиваешь в нём биты. Если вытолкнулся 1, то увеличиваешь счётчик.., и так со-всеми байтами массива
0
Hikari
Хитрая блондиночка $)
1453 / 966 / 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
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
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
Constantin Cat
2981 / 1115 / 376
Регистрация: 28.02.2015
Сообщений: 2,453
Завершенные тесты: 1
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
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
20.01.2016, 11:46 6
можно использовать команду POPCNT r, r/m* — (Return the Count of Number of Bits Set to 1)
Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-х битных регистров
0
Hikari
Хитрая блондиночка $)
1453 / 966 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
20.01.2016, 11:52 7
Цитата Сообщение от Mikl___ Посмотреть сообщение
проще нужно
Аригато, семпай
Я не оч. по ассемблеру. Так... по мелочам...
Цитата Сообщение от Constantin Cat Посмотреть сообщение
bx, bp, si и di и без маштабирования.
Согласно, просто не сразу в голову пришло lods использовать.
0
j_shchel
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6
20.01.2016, 12:10  [ТС] 8
Спасибо всем, огромное!!!
Пойду разбираться
0
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2016, 13:51

Как подсчитать нечетное количество чисел в массиве
Подскажите пожалуйста как можно подсчитать количество нечетных чисел в массиве...

[Debug] В массиве подсчитать количество чисел с нечётным количеством единиц
В общем, в колледже начали проходить новый тип задач в ассамблере, по этому...

Подсчитать количество повторяющихся чисел в массиве, стоящих рядом (tasm)
Задан массив А из N чисел. В массиве А рядом могут стоять одинаковые числа....


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru