in een bits reeks 2 getallen omdraaien

  • Onderwerp starter Onderwerp starter rxr
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

rxr

Gebruiker
Lid geworden
24 okt 2008
Berichten
105
Hallo

Deze code heb ik beschikbaar maar de bedoeling is dat we bit 7 met bit 13 omdraaien. Nu heb ik een werkende oplossing maar deze is zo lelijk dat elke willekeurige programmeur hier de tranen van in de ogen springen.

orgineel (deze draait dus nog niets om)

Code:
#include <stdio.h>

unsigned int x, getal;
unsigned int masker = 0x8000;

int main(void)
{
	printf("geef een getal: ");
	scanf("%d", &getal);
	for(x=0; x < 16; x++)
	{
		if((getal & masker) != 0)
		printf("1");
		else
		printf("0");
		masker = masker >> 1;
	}
	printf("\nKlaar\n");
	return 0;
}

mijn oplossing:
Code:
#include <stdio.h>

unsigned int x, getal, temp13, temp8, temp9, temp10, temp11, temp12, temp7, temp14, temp15; 
unsigned int masker = 0x8000;

int main(void)
{
	printf("geef een getal: ");
	scanf("%d", &getal);
	for(x=0; x < 16; x++)
	{
		if(x < 7)
		{
		if((getal & masker) != 0)
		printf("1");
		else
		printf("0");
		}
		if(x == 7) 
		{	
		if((getal & masker) != 0)
		temp7 = 1;
		else
		temp7 = 0;
		}
		if(x == 8) 
		{	
		if((getal & masker) != 0)
		temp8 = 1;
		else
		temp8 = 0;
		}
		
		if(x == 9) 
		{	
		if((getal & masker) != 0)
		temp9 = 1;
		else
		temp9 = 0;
		}
		
		if(x == 10) 
		{	
		if((getal & masker) != 0)
		temp10 = 1;
		else
		temp10 = 0;
		}
		
		if(x == 11) 
		{	
		if((getal & masker) != 0)
		temp11 = 1;
		else
		temp11 = 0;
		}
		
		if(x == 12) 
		{	
		if((getal & masker) != 0)
		temp12 = 1;
		else
		temp12 = 0;
		}
		
		if(x == 13) 
		{	
		if((getal & masker) != 0)
		temp13 = 1;
		else
		temp13 = 0;
		}
		
		if(x == 14) 
		{	
		if((getal & masker) != 0)
		temp14 = 1;
		else
		temp14 = 0;
		}
		
		if(x == 15) 
		{	
		if((getal & masker) != 0)
		temp15 = 1;
		else
		temp15 = 0;
		}
	masker = masker >> 1;	
	}
	printf("%d%d%d%d%d%d%d\n", temp13, temp8, temp9, temp10, temp11, temp12, temp7, temp14, temp15);
	printf("\nKlaar\n");
	return 0;
}
Nu had ik in gedachte om hier een mooie functie voor te maken. Maar hoe zorg ik er voor dat mijn variable namen dynamisch worden zodat zeg maar tempx krijg, en dat x dan voor het getal staat. Of hebben jullie andere ideeën. Het is een school opdracht dus gelieve niet complete antwoorden geven maar in de richting helpen wordt sterk gewaardeerd.
 
Laatst bewerkt:
arrays gebruiken?
[CPP]
int temp[14]; //array met 15 plaatsen, 0-14
[/CPP]

en dan een geneste for loop, waarbij je de array kan aanroepen met temp[y] bijv.

Ik heb het niet getest, en ik ben zelf ook nog nieuw met c++, maar ik geloof dat dit zou moeten werken.
 
ja uiteraard, een array gebruiken. Dat is inderdaad net zo handig.

om de code nog iets te verkorten had ik nu dit:

Code:
#include <stdio.h>

unsigned int x, y, getal, temp13, temp7; 
unsigned int masker = 0x8000;

int main(void)
{
	printf("geef een getal: ");
	scanf("%d", &getal);
	for(x=0; x < 15; x++)
	{
		if(x == 7) 
		{	
		if((getal & masker) != 0)
		temp7 = 1;
		else
		temp7 = 0;
		}
		if(x == 13) 
		{	
		if((getal & masker) != 0)
		temp13 = 1;
		else
		temp13 = 0;
		masker = masker >> 1;
		}
	}
	for(y=0; y < 15; y++)
	{
		if((y != 7) || (y != 13))
		{
		if((getal & masker) != 0)
		printf("1");
		else
		printf("0");
		}
		else if(y == 7)
		{
			printf("%d", temp13);
		}
		else if(y == 13)
		{	
			printf("%d", temp7);
		}
		masker = masker >> 1;
	}
	printf("\nKlaar\n");
	return 0;
}

maar we gaan door

alvast bedankt
 
Je weet dus al wat een bitmask is. Wat dacht je van het volgende?

Je gebruikt een bitmask om de 7de bit te isoleren, en ook een voor de 13de bit.
De resultaten van de bitmasks shift je, zodat voor het eerste resultaat je 7de bit naar de 13de geshift wordt, en voor het tweede resultaat het omgekeerde.

Vervolgens zet je de 7de en 13de bit in je origineel uit (bitmask maken, bitwise AND), waarna je dmv een bitwise OR je resultaten van bovenstaande paragraaf invoegt.

Nu moet je dit enkel nog in code zetten ;) probeer eerst zelf maar en we zien wel hoever je geraakt
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan