Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53

Найти произведение 2 чисел с помощью битовых операций

04.02.2010, 17:26. Показов 9446. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста, не понимаю задание....
Заданы два числа <=16.
Найти их произведение и с помощью битовых операций
записать оба множителя и их произведение одно за другим
в ячейку памяти размером в два байта без пропуска битов.

Насколько я поняла вводим два числа a и b <=16
S=a*b;
с помощью битовых операций
записать оба множителя и их произведение одно за другим
в ячейку памяти размером в два байта без пропуска битов
Хм....не понимаю, как это должно выглядеть....
например так: 122
это как а=1, b=2, S=2
Объясните плиз)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2010, 17:26
Ответы с готовыми решениями:

Объясните перебор всех значений от 0 до n с помощью битовых операций
for (int i = (1 &lt;&lt; n) - 1; i &gt;= 0; i--) { for (int j = 0; j &lt; n; j++) { if (i &amp; (1 &lt;&lt; j)) Этот кусок кода означает...

С помощью только битовых операций превратите последний 0 в 1, а все остальное превратить в 0
С помощью только битовых операций(еще и без циклов, проверок, инкремента и смени знака) превратите последний 0 в 1, а все остальное...

С помощью битовых операций запишите число в ячейку памяти минимального размера
Дано пятизначное число. (Может быть например такое 00001). С помощью битовых операций запишите его в ячейку памяти минимального размера....

34
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
07.02.2010, 14:03
Студворк — интернет-сервис помощи студентам
Согласен. Все когда-то видели это первый раз. Но такую информацию надо черпать из книг
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
07.02.2010, 14:14  [ТС]
Но такую информацию надо черпать из книг
и читаю иначе бы не сделала два задания, самостоятельно!!!

просто не очень представляю как выглядит:
с помощью битовых операций записать оба множителя
и их произведение одно за другим в ячейку памяти
размером в два байта без пропуска битов
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
07.02.2010, 15:02
odip описал как оно должно выглядеть, я вам привел пример кода, вы переписали его под себя. Так какой конкретно вопрос вас мучает ?
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
07.02.2010, 15:25  [ТС]
если я правильно поняла пример кода
Assembler
1
2
3
4
5
6
7
8
9
mov al,[num1] ; берем первое число
shr al,4 ; сдвигаем его
or al,[num2] ; объеденяем со вторым
mov byte ptr [rez],al ; записываем что получилось
mov al,[num1]
mul [num2] ; умножаем одно на другое
mov byte ptr [rez+1],al ; записываем результат умножения
......
rez dw ?
-создали массив из двух элементов по 1 байту каждый
-перемножили
-в перву ячейку записали что получилось,
а во вторую произведение

в 8 строке .... что необходимо еще добавить?
9 строчка результат записываем в слово
знак вопроса не обходимо заменить или так и должно быть?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
07.02.2010, 15:35
Ну у вас же в посте #13 готовая функция. Вам нужно только принять 2 числа, передать их в эту функцию и вывести, как вам нужно, результат.
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
07.02.2010, 15:45  [ТС]
C++
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
#include "stdafx.h"
#include "iostream"
#include "windows.h"
 
INT16 my_assembler(INT16 a,INT16 b)
{
    INT16 rez=0;
    __asm
    {
        MOV ax,[a] // берем первое число
        SHR ax,4 // сдвигаем его
        OR ax,[b] // объеденяем со вторым
        MOV byte ptr [rez],al // записываем что получилось
        MOV ax,[a]
        IMUL [b] // умножаем одно на другое
        MOV byte ptr [rez+1],al // записываем результат умножения
        [B]//......
        //rez dw ?[/B]
    }
    
return rez;
}
 
void main()
{
int  a, b;
    system("title Вычисление значения выражения");
        printf("Vvedite chislo A:\n");
        scanf("%d",&a);
        printf("Vvedite chislo B:\n");
        scanf("%d",&b);
                
        if (a>16 || b>16)
    {
        printf("Chisla dolgni bit' <=16 \n");
    }
    else
    {
        printf("Otvet=%i\n",my_assembler(a,b));
    }
system("pause");
}
вообще вот все полностью
когда я ввожу числа а=2 и в=2 ответ=1026
rez dw ? меня смущает....и компилятор ругается(
0
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
07.02.2010, 15:56
Странно. Ответ должен быть 1058
Кстати как уже было сказано, видимо всё таки <16, а не <=16
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
07.02.2010, 16:11  [ТС]
Странно. Ответ должен быть 1058
:'((((
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
07.02.2010, 16:28
Ну это уже моя ошибка. Должно быть не shr, a shl...

Добавлено через 2 минуты
Цитата Сообщение от VIP_Persona Посмотреть сообщение
rez dw ? меня смущает....и компилятор ругается(
Это строчка нужна была бы, если бы вы писали на чистом ассемблере в масме, например, а сейчас ее заменит строчка INT16 rez;
0
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
07.02.2010, 16:31
Ну это уже моя ошибка должно быть не shr, a shl
Мы походу уже слишком долго этот вопрос обсуждаем, запарились просто. Я даже не обломился это скомпилировать, и только в отладчике увидел что там shr всё портит
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
07.02.2010, 16:38  [ТС]

спасибо Вам оч большое
Вы такие все умные, я тоже так хочу.....
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
08.02.2010, 18:25  [ТС]
Странно. Ответ должен быть 1058
объясните мне плиз как при умножение 2 на 2 получается ответ 1058
спасибо)
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
08.02.2010, 22:40
1058 - это десятеричное число. В шестнадцатеричном виде оно станет 0x422. А из-за особенности процессора байты расположатся наоборот. Т.е. они запишутся как 22 04.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
09.02.2010, 13:23
нужно printf() делать в hex-mode !
printf( "%x\n", 1058 );
0
0 / 0 / 0
Регистрация: 04.02.2010
Сообщений: 53
09.02.2010, 16:13  [ТС]
нужно printf() делать в hex-mode !
printf( "%x\n", 1058 );
блин...а что такое hex-mode?
это в сишнике в конце надо написать?

Добавлено через 1 час 50 минут
1058 - это десятеричное число. В шестнадцатеричном виде оно станет 0x422. А из-за особенности процессора байты расположатся наоборот. Т.е. они запишутся как 22 04.
спасибо огромное))))
я поняла)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2010, 16:13

Реализовать длинную арифметику с использованием битовых операций и больших чисел
Всем привет. Возникла задача реализовать длинную арифметику с использованием битовых операций и больших чисел, то есть представлять число...

С помощью оператора For найти произведение чисел от 1 до 10
1. С помощью оператора For написать программу нахождения произведения чисел от 1 до 10

С помощью оператора Repeat(while) найти произведение чисел
4. С помощью оператора Repeat(while) программа для нахождения произведения чисел

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

С помощью оператора цикла с постусловием найти произведение четных чисел натурального ряда от 2 до 10
3. С помощью оператора цикла с постусловием найти произведение четных чисел натурального ряда от 2 до 10


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru