Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- //4-батовое поле посчитать количество 1
- #include <ctime>
- using namespace std;
- //На вход программы случайная строка, состоящая из n бит.Написать программу, вычисляющую оценку вероятности того,
- //что в этой строке есть точно две одинаковых непересекающихся подстроки длины m;
- const int n = 15; const int m = 4;
- void genStr(int mas[], int l) {
- for (int i = 0; i < l; i++)
- mas[i] = rand() % 2;
- }
- void output(int str[], int l) {
- for (int i = 0; i < l; i++) {
- cout << str[i];
- }
- }
- int main()
- {
- srand(time(NULL));
- int str[n]; int subs[m];
- int check; int counter = 0, gcounter = 0; int GK = 0; int N = 1000000; int NminusM = n - m;
- int k = 0; int i = 0; int j = 0; int s = 0; int t = 0;
- __asm {
- lea esi, str //вбрасываем массив str
- lea edi, subs // subs
- FOR_K : //внутренности for (int k = 0; k < N; k++) {
- mov i,0
- mov j,0
- mov t,0
- mov s,0
- FOR_S: //for (int s = 0; s < n; s++) - генерация элементов массива str
- call rand//call rand;
- mov ecx, s //индекс кладется в ecx
- and eax, 1//%2
- mov edx, ecx //ecx пишем в edx
- mov ebx, ecx //ecx пишем в ebx
- and ebx, 31 //ebx делится на 32, и остаток кладется в ebx (номер бита в инте)
- sar edx, 5 //в EDX кладется результат деления (номер инта)
- cmp eax, 1 //в зависимости от рандомно сгенерированного в eax бита, делаем или bts, или btr
- jne skip1S
- bts[esi + edx * 4], ebx
- jmp skip2S
- skip1S :
- btr[esi + edx * 4], ebx
- skip2S :
- inc s //s++
- mov ecx, s //для cmp сохраняем s в ecx
- cmp ecx, n // сравниваем с n
- jne FOR_S // если не равно n, повторяет все внутри FOR_S:
- FOR_T : //for (int t = 0; t < m; t++) - генерация элементов массива sub
- call rand//call rand;
- mov ecx, s //индекс кладется в ecx
- and eax, 1//%2
- mov edx, ecx
- mov ebx, ecx
- and ebx, 31
- sar edx, 5
- cmp eax, 1
- jne skip1T
- bts[edi + edx * 4], ebx
- jmp skip2T
- skip1T :
- btr[edi + edx * 4], ebx
- skip2T :
- inc t //t++
- mov ecx, t //для cmp сохраняем t в ecx
- cmp ecx, m // сравниваем с m
- jne FOR_T // если не равно m, повторяет все внутри FOR_T:
- FOR_I: //for (int i = 0; i < n - m; ) {
- mov j, 0 //зануляем j
- FOR_J: // for (int j = 0; j < m; j++) {
- //if (subStr[j] == str[j + i])
- mov eax,j
- mov ebx,j
- and eax, 31
- sar ebx, 5
- bt[edi + ebx * 4], eax //subStr[j]
- setc ch
- mov eax, j //[j + i]
- add eax, i
- mov ebx, eax
- and eax, 31
- sar ebx, 5
- bt[esi + ebx * 4], eax //str[j + i]
- setc cl
- cmp ch, cl
- jne ELSE_SUB_STR
- mov check,1 //check = true;
- inc counter // counter++;
- ELSE_SUB_STR: // else check = false;
- mov check, 0
- //if (check == false || counter == m)
- cmp check, 0 //check == false?
- je IF_COUNTER_M
- mov ecx, counter
- cmp ecx, m //counter == m?
- jne END_IF_CHECK_COUNTER
- IF_COUNTER_M:
- //if (counter == m) {
- mov ecx, counter
- cmp ecx, m //counter == m?
- jne END_IF_COUNTER_M
- inc gcounter //gcounter++;
- mov ecx, i //i += m;
- add ecx,m
- mov i, ecx
- END_IF_COUNTER_M:
- mov counter, 0 //counter = 0;
- jmp BREAK_HERE
- END_IF_CHECK_COUNTER:
- inc j //i++
- mov ecx, j //для cmp сохраняем i в ecx
- cmp ecx, m // сравниваем с n-m
- jne FOR_J //если не равно n-m, повторяет все внутри FOR_I:
- BREAK_HERE://СЮДА, НАВЕРНОЕ, ПРЫГНЕТ BREAK
- inc i
- mov ecx, i //для cmp сохраняем i в ecx
- cmp ecx, NminusM // сравниваем с n-m
- jne FOR_I //если не равно n-m, повторяет все внутри FOR_I:
- cmp gcounter,2 // if (gcounter == 2)
- jne NEXT
- inc GK // GK += 1;
- NEXT:
- mov counter,0 //counter = 0;
- mov gcounter,0 //gcounter = 0;
- inc k //k++
- mov ecx, k //для cmp сохраняем k в ecx
- cmp ecx, N // сравниваем с N
- jne FOR_K //если не равно N, повторяет все внутри FOR_K:
- }
- cout << GK;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement