Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2016, 22:34   #1
SvetaNova
Новичок
Джуниор
 
Регистрация: 22.11.2016
Сообщений: 1
По умолчанию Посчитать количество битов в состоянии 0 для каждого символа.

Задана последовательность символов заканчивающееся точкой. Посчитать количество битов в состоянии 0 для каждого символа. Создать новый массив, который содержит эти значения для каждого символа. Создать новый массив, который содержит эти значения для каждого символа. Вывести на экран символ, его двоичное представление и количество битов в состоянии 1.
У кого есть такое? может кто скрины скинуть??
SvetaNova вне форума Ответить с цитированием
Старый 23.11.2016, 06:24   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Что значит "состояние 0/1" ?!
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 23.11.2016, 07:03   #3
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

R71MT
я думаю, например, вводим символ Z. В двоичном представлении он имеет вид 0101 1010. Вот эти нолики посчитать и надо.
Мановар вне форума Ответить с цитированием
Старый 23.11.2016, 12:45   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

делается так -- создается массив из 16 байтов
Код:
.data
table 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
string db "abracadabra-lyaski-masyaski"
для примера анализируем строку string
Код:
     mov bx,offset table
     mov si,offset string
     xor ax,ax
     cwd
     mov cx,sizeof string
@@:  lodsb
     ror ax,4
     xlat
     add dl,al
     adc dh,0
     shr ax,12
     xlat
     add dx,ax
     loop @b

Последний раз редактировалось Mikl___; 23.11.2016 в 12:55.
Mikl___ вне форума Ответить с цитированием
Старый 23.11.2016, 13:02   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,355
По умолчанию

Цитата:
Сообщение от Mikl___ Посмотреть сообщение
делается так
http://graphics.stanford.edu/~seande...ntBitsSetNaive
waleri вне форума Ответить с цитированием
Старый 23.11.2016, 13:53   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

waleri,
по ссылке -- либо по одному биту
Код:
for (c = 0; v; v >>= 1)
{
  c += v & 1;
}
либо за 4 шага
Код:
static const unsigned char BitsSetTable256[256] = 
{
#   define B2(n) n,     n+1,     n+1,     n+2
#   define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#   define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
    B6(0), B6(1), B6(1), B6(2)
};

unsigned int v; // count the number of bits set in 32-bit value v
unsigned int c; // c is the total bits set in v

// Option 1:
c = BitsSetTable256[v & 0xff] + 
    BitsSetTable256[(v >> 8) & 0xff] + 
    BitsSetTable256[(v >> 16) & 0xff] + 
    BitsSetTable256[v >> 24]; 

// Option 2:
unsigned char * p = (unsigned char *) &v;
c = BitsSetTable256[p[0]] + 
    BitsSetTable256[p[1]] + 
    BitsSetTable256[p[2]] +	
    BitsSetTable256[p[3]];


// To initially generate the table algorithmically:
BitsSetTable256[0] = 0;
for (int i = 0; i < 256; i++)
{
  BitsSetTable256[i] = (i & 1) + BitsSetTable256[i / 2];
}
но у меня также по четыре и более простая реализация -- хотите еще быстрее --> можно составить таблицу на 256 состояний, тогда сразу по 8 разрядов и не надо делать сдвиги чтобы выделять по 4 разряда,
Код:
lodsb
xlat
add count,al
только студенты это читать не будут, им это не интересно
offtop
waleri, Вы на wasm.ru не были?

Последний раз редактировалось Mikl___; 23.11.2016 в 13:55.
Mikl___ вне форума Ответить с цитированием
Старый 23.11.2016, 14:58   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,355
По умолчанию

Нет, не был.
waleri вне форума Ответить с цитированием
Старый 24.11.2016, 09:18   #8
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 296
По умолчанию

Код:
  cld
  xor dx,dx
  mov si,offset String
@@1:
  lodsb
  cmp al,'.'
  je @@3
  mov cx,8
@@2:
  shr al,1
  cmc
  adc dx,0
  loop @@2
  jmp @@1
@@3:
; dx = результат
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.11.2016, 09:21   #9
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 296
По умолчанию

Это без учёта точки...
Не уверен, что здесь скорость нужна
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.11.2016, 11:41   #10
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

7in, команда cmc не нужна. shr сама установит CF.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal Для каждого символа текста указать его относительную частоту появления в тексте student___ Помощь студентам 52 02.05.2013 18:12
Для каждого аi найти ki количество его повторов последовательности. Yakov112 Общие вопросы C/C++ 2 06.10.2012 23:18
Проверить точное количество строк, оставляя массив в исходном состоянии alt5000 PHP 8 02.12.2011 19:38
посчитать значение по каждой статье за определенный период для каждого листа Graver Microsoft Office Excel 5 04.12.2009 01:31
Вычислить и запомнить количество отрицательных элементов каждого столбца для матрицы A(10,10) , B (15,20) bitmania Помощь студентам 3 15.10.2008 01:06