Задание: Реализовать в С++ функцию void BigRorCount(byte* M1, short len, short count), где M1 – сверхбольшое целое положительное число (байтовый массив длиною len), count – количество разрядов сдвига. Операция – циклический сдвиг вправо (в сторону младших разрядов) на количество двоичных разрядов, заданное параметром count. При этом count младших разрядов уступают на место старших разрядов . Нужно использовать команды для 32-разрядных данных. Если значения len не кратно 4, то при необходимости для последних байт использовать команды для 8-разрядных данных.
Суть проблемы: не переносит последний бит на перед
Source.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define n 8 // количество байтов у сверхбольшому числе
typedef unsigned char byte;
extern "C" void BigRorCount(byte* M1, short len, short count);
void PrintBinary(byte *number, short length)
{
for (short i = length; i != 0; --i)
{
byte currentPart = *(number + i - 1);
currentPart & 0x80 ? printf("1") : printf("0");
currentPart & 0x40 ? printf("1") : printf("0");
currentPart & 0x20 ? printf("1") : printf("0");
currentPart & 0x10 ? printf("1") : printf("0");
currentPart & 0x08 ? printf("1") : printf("0");
currentPart & 0x04 ? printf("1") : printf("0");
currentPart & 0x02 ? printf("1") : printf("0");
currentPart & 0x01 ? printf("1") : printf("0");
printf(" ");
}
printf("\n\n");
}
int main()
{
srand(time(NULL));
byte x[n];//сверхбольшое число
for (int i = 0; i<n; i++)
{
x[i] = rand() % 255;
}
printf("Before: \n\n");
printf("M1 = \n");
PrintBinary(x, n);
BigRorCount(x, n, 1);
printf("New M1 = \n");
PrintBinary(x, n);
system("pause");
return 0;
}`
AsmSource.asm:
.386
.model flat, C
.code
BigRorCount proc
push ebp
mov ebp, esp;
mov edi, [ebp + 8] ;m1
mov ebx, [ebp + 12] ;length
mov esi, [ebp + 14] ; count
cmp dl, 0
je false
true:
mov al, 1
jmp cont
false:
mov al, 0
cont:
mov ecx, 0
clc
pushf
_loop:
cmp ecx, ebx
jge finish
popf
rcr byte ptr[edi+ecx], 1
pushf
inc ecx
jmp _loop
;;;;;;;;;;;
pushf
rcl byte ptr[edi+0], 1
popf
rcr byte ptr[edi+0], 1
;;;;;;;;;;;
; _while:
; cmp eax, esi
; jge finish
; mov ecx,0
; _loop:
; cmp ecx, ebx
; jge label1
; popf
; rcr byte ptr[edi+ecx],1
; pushf
; inc ecx
; jmp _loop
; label1:
; inc eax
; jmp _while
; попытка реализации сдвига через двойной цикл
finish:
popf
pop ebp
ret
BigRorCount endp
end
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите, пожалуйста как работать с большими числами, такие как, 10^90(можно и меньше) uint64_t не помогает
Для чего нужен был вспомогательный класс auto_ptr_refНужны примеры простейшей реализации и использования