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

Подсчитать количество нулей в разрядах элемента данных

19.09.2010, 16:58. Просмотров 3360. Ответов 11
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста, как подсчитать количество нулей в разрядах элемента данных. Например, дано 0001001100101111b и нужно подсчитать кол-во нулей
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2010, 16:58
Ответы с готовыми решениями:

дан массив из 10 байт. Подсчитать количество единиц во всех разрядах кратным 3: 3,6,9...75,78
прикольный ник)) плииз задачку Добавлено через 3 часа 10 минут последнюю задачу не могу...

Подсчитать количество нулей и единиц в заданном шестнадцатеричном числе.
Задача:Подсчитать количество нулей и единиц в заданном шестнадцатеричном числе.

В поле однобайтовых чисел найти количество нулей после первого ненулевого элемента
В ассемблере,в поле однобайтовых чисел с адресами от 02АВ до 0211 найти количество нулей после...

Подсчитать число единиц во всех разрядах заданного двоичного числа
Подсчитать число единиц во всех разрядах заданного двоичного числа Х(вес) методом исключения...

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах
#include <iostream> #include<conio.h> main() { setlocale(LC_ALL, "Russian"); int N,digit = 0;...

11
Orwomoi
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
19.09.2010, 18:06 2
Самый простой способ, но, возможно, не самый быстрый из-за кол-ва условных переходов.
Assembler
1
2
3
4
5
6
7
8
9
10
mov eax,<число>
mov ecx,32 ;кол-во битов в числе
xor edx,edx ;тут будет ответ
l1: ;метка
rcl eax,1 ;крутим один бит в CF
jc  @f ;если флаг = 1, перескочить
add edx,1 ;иначе увеличить счетчик нулей
@@: ;анонимная (безимяная) метка
sub ecx,1
jnz l1 ;повторять пока не проверим все биты
1
Vita7881
6 / 6 / 0
Регистрация: 07.10.2009
Сообщений: 156
19.09.2010, 18:18  [ТС] 3
что-то не работает(
0
Somebody
2809 / 1620 / 251
Регистрация: 03.12.2007
Сообщений: 4,223
Завершенные тесты: 3
19.09.2010, 18:23 4
Чтобы было меньше переходов, для подсчёта количества единиц можно делать
Assembler
1
adc edx, 0
А оттуда узнать количество нулей.
1
Vita7881
6 / 6 / 0
Регистрация: 07.10.2009
Сообщений: 156
19.09.2010, 18:38  [ТС] 5
а можно код целиком, плиззз)
0
Tronix
157 / 104 / 6
Регистрация: 22.08.2010
Сообщений: 215
19.09.2010, 18:59 6
Кстати афаик в SSE4.2/SSE4a появилась прям команда - POPCNT, считает кол-во бит установленных в единицу... Затестить не могу, за неимением...

Добавлено через 14 минут
И еще LZCNT, как я понял, считает кол-во нулевых бит...
1
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
19.09.2010, 21:30 7
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cseg segment
org 100h
 
proga:
 
    mov ah,simb             ;00010001
    mov cx,0ah
    cikl:
    test ah,sravn           ;сравниваем бит текущий из sravn - 00001
    call proc               ;проверка на совпадение бит
    shl sravn,1             ;ставим 2-й разряд - 000010
    loop cikl
 
proc:
    jz nxt
    ret
nxt:
    inc sovp                ;подсчёт нулей
    ret
 
int 20h
 
sravn db 1h
sovp db 0
simb db 00010001001b
 
cseg ends
end proga
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cseg segment
org 100h
 
proga:
 
    lea di,stroka       ;искомая строка
    mov al,'0'          ;ищем 0
    mov cx,strlen       ;длина строки
cikl:
    scasb               ;сравниваем оч-й символ
    call l              ;вызов процедуры для проверки соответствия символов
    loop cikl
 
l:
    jz n:
    ret
n:
    inc nul
    ret
 
int 20h
 
nul db 0
stroka db '00010001001b$'
strlen equ $-simb
 
cseg ends
end proga
Добавлено через 15 минут
25: strlen equ $-stroka

правильно? я придумал
1
Vita7881
6 / 6 / 0
Регистрация: 07.10.2009
Сообщений: 156
20.09.2010, 17:51  [ТС] 8
ага, спс=)

Добавлено через 9 минут
вроде бы прога должна считать кол-во нулей, в разрядах, но она почему-то постоянно выводит число 16, ничего не считает, подскажите что не так
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CODESG      SEGMENT PARA    'CODE'
        ASSUME CS:CODESG, DS:CODESG, SS:CODESG, ES:CODESG
        ORG 100H    ;Начало в конце PSP
BEGIN:      JMP     MAIN    ;Обход через данные
    ;-----------------------------Определение данных-------------------------------
    org 100h
    number dw 100100011011110b
    res dw 0,'$'
    
MAIN        PROC    NEAR
    ;------------------------------------Тело программы------------------------------
 mov ax, word ptr number ; пишем число в ах
 xor bx, bx
 mov cx, 16d ; количество повторов
 loop1: 
  dec cx
  test ax, 1 ; тестируем нулевой бит ах
  jnz not_zero
   inc bx ; если он равен 0, добавляем 1 к вх
  not_zero:
  shr ax, 1 ; сдвигаем ах на один бит ВПРАВО
 cmp cx, 0
 ja loop1 ; если СХ больше нуля - повторяем цикл
 mov ax, bx
 mov bl, 10d 
 div bl ; делим число на 10, получаем десятки в al, а остаток (единицы) в ah
 add al, 48d ; переводим число в символ
 add ah, 48d ; переводим число в символ
 mov res, ax ; сохраняем результат (десятки попадут на меньший адрес, единицы на старший)
 push ds
 pop es
 
 
  MOV AH,09
  LEA DX, res
  INT 21H
 
 mov ah,01
 int 21h ; выводим на экран
 ret 
MAIN        ENDP
CODESG      ENDS
        END BEGIN
1
assemb
63 / 63 / 1
Регистрация: 14.04.2010
Сообщений: 170
20.09.2010, 18:43 9
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
CODESG          SEGMENT
                ASSUME CS:CODESG, DS:CODESG, SS:CODESG, ES:CODESG
                ORG     100H    ;Начало в конце PSP
BEGIN:          
        
MAIN            PROC
        ;------------------------------------Тело программы------------------------------
 mov ax, word ptr number ; пишем число в ах
 xor bx, bx
 mov cx, 16d ; количество повторов
 loop1: 
  dec cx
  test ax, 1 ; тестируем нулевой бит ах
  jnz not_zero
   inc bx ; если он равен 0, добавляем 1 к вх
  not_zero:
  shr ax, 1 ; сдвигаем ах на один бит ВПРАВО
 cmp cx, 0
 ja loop1 ; если СХ больше нуля - повторяем цикл
 mov ax, bx
 mov bl, 10d 
 div bl ; делим число на 10, получаем десятки в al, а остаток (единицы) в ah
 add al, 48d ; переводим число в символ
 add ah, 48d ; переводим число в символ
 mov res, ax ; сохраняем результат (десятки попадут на меньший адрес, единицы на старший)
 
 
  MOV AH,09
  LEA DX, res
  INT 21H
 
 mov ah,01
 int 21h ; выводим на экран
 ret 
 
        ;-----------------------------Определение данных-------------------------------
        number dw 100100011011110b
        res dw 0,'$'
MAIN            ENDP
CODESG          ENDS
                END BEGIN
1
Vita7881
6 / 6 / 0
Регистрация: 07.10.2009
Сообщений: 156
20.09.2010, 19:40  [ТС] 10
спасибо большое)), а еще не могли бы подсказать, как можно вывести число на экран, данное в двоичном коде
0
kidiam
22 / 22 / 0
Регистрация: 12.07.2010
Сообщений: 42
21.09.2010, 01:41 11
На fasm-е пойдет?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
format PE console
entry start
include 'INCLUDE\win32a.inc'
 
section '.c' code readable executable
start:
        cinvoke scanf,sfmt,x
 
        mov     eax, [x]        ; вычисление через подсчет единиц
        xor     ecx, ecx
 
@up:    mov     ebx, eax
        inc     ecx
        dec     ebx
        and     eax, ebx
        jnz     @up
 
        mov     eax, 32         ; из 32-х вычтим
        sub     eax, ecx        ; кол-во единиц
 
        cinvoke printf,sfmt,eax
 
        mov     ebx, [x]        ; преобразование в двоичную строку
        mov     edi, s
        mov     ecx, 32
        cld
 
@up2:   mov     al, '0'
        rcl     ebx,1
        adc     al, 0
        stosb
        loop    @up2
 
        xor    al, al
        stosb
 
        cinvoke printf, sfmt2, s
 
        cinvoke system,cmd
        invoke ExitProcess,0
 
section '.d' data readable writeable
cmd     db      'pause',0
sfmt    db      '%d',0
sfmt2   db      10, 13, '%s', 10, 13 ,0
x       dd      ?
s       rb      32+1
 
section '.i' import data readable
 
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess'
 
import msvcrt,\
       scanf,'scanf',\
       printf,'printf',\
       system,'system'
1
Vita7881
6 / 6 / 0
Регистрация: 07.10.2009
Сообщений: 156
29.09.2010, 18:21  [ТС] 12
а подскажите как мне вывести число не как представлено в машине, а в обратном порядке в этом коде:


Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.model tiny
.code
.startup
 
        mov cx,5                ; 10 байт / 2 = 5
        mov si,offset number    ; DS:SI = number
next_dw:
        lodsw                   ; AX = 2 байта из number
        mov bx,ax               ; BX = AX
        push cx                 ; сохраним счетчик количества двойных слов
        mov cx, 16              ; счетчик для 16 бит в двойном слове
        mov ah, 2h              ; функция int21 - печать символа из DL
                                        
lup:    rcl bx, 1               ; крутим влево и смотрим CF
        mov dl, 30h             ; ascii = number + '0'
        adc dl, 0               ; и прибавляем с CF ascii=30h+0 или 30h+1
        int 21h                 ; вызываем int 21h, ah = 2h
        loop lup                ; крутим 16 раз
 
        pop cx                  ; восстанавливаем счетчик двойных слов
        loop next_dw            ; повторяем пять раз
 
        ;int 20h                 ; выход
 mov ah,01
 int 21h ; выводим на экран
 ret 
number dt 132f3c5eh ; число
  
end
Добавлено через 15 минут
а подскажите в этом коде, который выше, правильно представляется число из 16-тиричной с.с. в двоичное?

Добавлено через 9 минут
спасибо, я уже разобралась)))
0
29.09.2010, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2010, 18:21

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах
Дано натуральное число N (N &gt; 9). Определить количество нулей в цифровой записи числа, кроме нулей...

Определите количество нулей в записи числа кроме нулей в его младших разрядах
Дано натуральное число N(N&gt;9). Определите количество нулей в записи числа кроме нулей в его младших...

Определить количество нулей в цифровой записи числа, кроме нулей в младших разрядах
Дано натуральное число N (N &gt; 9). Определить количество нулей в цифровой записи числа, кроме нулей...


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

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

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