Răspuns :
#include <iostream>
using namespace std;
char a='A';
int main()
{
int contor=0;
int ascii=a;
cout<<ascii<<endl;
while(ascii!=1) //bucla continua pana ascci =1
{
if(ascii%2==1)//daca are biti de 1
{
contor++; // ii numaram
}
ascii/=2; //reducem valoarea initiala
if(ascii==1) //daca ultimul bit este 1
contor++; //il numaram
}
cout<<"are "<<contor<<" de bit 1"; //afisam
return 0;
}
using namespace std;
char a='A';
int main()
{
int contor=0;
int ascii=a;
cout<<ascii<<endl;
while(ascii!=1) //bucla continua pana ascci =1
{
if(ascii%2==1)//daca are biti de 1
{
contor++; // ii numaram
}
ascii/=2; //reducem valoarea initiala
if(ascii==1) //daca ultimul bit este 1
contor++; //il numaram
}
cout<<"are "<<contor<<" de bit 1"; //afisam
return 0;
}
Ok, problema e aceeași ca și dincolo :))) la transformarea din baza 10 în baza 2...
(ai acolo un 97, dar cred că era 7 :))) )
În loc de asta:
for (i = 97; i >= 0; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
Faci așa:
for(i=0;i<8;i++)binaryArray[i]=0;
for (i = 7; i >= 0 && deci; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
Deci scrii în vector 0-uri, apoi faci ce făceai tu, doar că mai pui o condiție ca deci să fie diferit de 0
Deci program final:
#include <stdio.h>
#include <stdlib.h>
unsigned int count(unsigned int binaryCode[], unsigned int start, unsigned int stop) {
if (start == stop) {
if (binaryCode[start] == 1) {
return 1;
} else {
return 0;
}
}
return count(binaryCode, start, (start + stop) / 2) + count(binaryCode, (start + stop) / 2 + 1, stop);
}
unsigned int compute(char ch) {
unsigned int deci = (unsigned int) ch; // codul ASCII pentru fiecare caracter
unsigned int binaryArray[8]; // codul bina pentru caracterul de mai sus
unsigned int i;
for (i = 0; i < 8;i++)binaryArray[i]=0;
for (i = 7; i >= 0 && deci; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
return count(binaryArray, 0, 7);
}
int main(int argc, char** argv) {
FILE * fisier = fopen("testfile", "r");
int size = 0; // va stoca numarul de caractere din fisier
char ch; //auxiliar, va citi fisierul pentru a deplasa cursorul pana la capat
int lastPosition; // se va tine dupa cursor
// cand cursorul nu mai inainteaza, se iese din bucla si vom obtine numarul de caractere
while (1) {
fscanf(fisier, "%c", &ch);
if (lastPosition == ftell(fisier)) break;
lastPosition = ftell(fisier);
}
size = ftell(fisier) - 1;
// printf("\n%d", size); // OK! Merge!
fseek(fisier, 0, 0); // mut cursorul inapot pe prima pozitie
char vector[size + 1]; // vectorul asta va stoca toate caracterele din fisier pe cate o pozitie
unsigned int bitCount[size]; // asta va retine pentru fiecare pozitie corespunzatoare vectorului de mai sus numarul de biti de 1
// vector are dimensiuea size + 1 pentru ca si terminatorul de sir va ocupa o pozitie
int i;
for (i = 0; i < size; i++) {
fscanf(fisier, "%c", &vector[i]); // de aici incep sa citesc fiecare caracter
bitCount[i] = compute(vector[i]); // fiecarui caracter ii va corespunde un bitCount[i]
printf("\n%u", bitCount[i]);
}
return (EXIT_SUCCESS);
}
(ai acolo un 97, dar cred că era 7 :))) )
În loc de asta:
for (i = 97; i >= 0; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
Faci așa:
for(i=0;i<8;i++)binaryArray[i]=0;
for (i = 7; i >= 0 && deci; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
Deci scrii în vector 0-uri, apoi faci ce făceai tu, doar că mai pui o condiție ca deci să fie diferit de 0
Deci program final:
#include <stdio.h>
#include <stdlib.h>
unsigned int count(unsigned int binaryCode[], unsigned int start, unsigned int stop) {
if (start == stop) {
if (binaryCode[start] == 1) {
return 1;
} else {
return 0;
}
}
return count(binaryCode, start, (start + stop) / 2) + count(binaryCode, (start + stop) / 2 + 1, stop);
}
unsigned int compute(char ch) {
unsigned int deci = (unsigned int) ch; // codul ASCII pentru fiecare caracter
unsigned int binaryArray[8]; // codul bina pentru caracterul de mai sus
unsigned int i;
for (i = 0; i < 8;i++)binaryArray[i]=0;
for (i = 7; i >= 0 && deci; i--) {
binaryArray[i] = deci % 2; // Conversia in baza 2
deci = deci / 2;
}
return count(binaryArray, 0, 7);
}
int main(int argc, char** argv) {
FILE * fisier = fopen("testfile", "r");
int size = 0; // va stoca numarul de caractere din fisier
char ch; //auxiliar, va citi fisierul pentru a deplasa cursorul pana la capat
int lastPosition; // se va tine dupa cursor
// cand cursorul nu mai inainteaza, se iese din bucla si vom obtine numarul de caractere
while (1) {
fscanf(fisier, "%c", &ch);
if (lastPosition == ftell(fisier)) break;
lastPosition = ftell(fisier);
}
size = ftell(fisier) - 1;
// printf("\n%d", size); // OK! Merge!
fseek(fisier, 0, 0); // mut cursorul inapot pe prima pozitie
char vector[size + 1]; // vectorul asta va stoca toate caracterele din fisier pe cate o pozitie
unsigned int bitCount[size]; // asta va retine pentru fiecare pozitie corespunzatoare vectorului de mai sus numarul de biti de 1
// vector are dimensiuea size + 1 pentru ca si terminatorul de sir va ocupa o pozitie
int i;
for (i = 0; i < size; i++) {
fscanf(fisier, "%c", &vector[i]); // de aici incep sa citesc fiecare caracter
bitCount[i] = compute(vector[i]); // fiecarui caracter ii va corespunde un bitCount[i]
printf("\n%u", bitCount[i]);
}
return (EXIT_SUCCESS);
}