webForumDet fria alternativet

Förklara kod

C/C++

9 svar · 461 visningar · startad av greyhound

Medlem sedan maj 20031 472 inlägg
Frågan#1

Hej, jag har i uppgift att skriva ett program som konverterar binärtal till decimaltal och tvärtom.

Jag sökte lite på webben tänkte att jag skulle lära mig lite där, då snubblade jag över denna kod:

for (int i=7; i>=0; i--) {
  int bit = ((n >> i) & 1);
  cout << bit;
}

Källa

Någon som kan förklara den där koden för mig?
Jag tänkte gjort på ett mycket krångligare sätt.
Jag vill inte att ni ska lösa uppgiften åt mig bara förklara vad den där koden gör, eller rättare sagt rad 2.

Medlem sedan feb. 20002 300 inlägg
#2

Vet inte hur mycket du kan om binär representation av tal. Men jag gör ett litet exempel så ser vi om du kan klura ut hur det fungerar. :)

n = 5 -> binärt = 00000101

n >> 1 är samma sak som 00000101 >> 1 vilket ger värdet 00000010 # Bitshifta ett steg åt höger. Värdet på n är nu 2

n & 1 är samma sak som 00000010 & 00000001 vilket ger 0 eftersom bitarna i båda talen måste vara 1 för att det ska bli 1

Red:
Nu har du två exempel som borde ge dig en hint hur det fungerar. ;)

Medlem sedan juni 20034 013 inlägg
#3

>> flyttar bitarna i variabeln n i steg till höger.
& betyder logiskt och.

Vi tar ett exempel: Om du har talet 42 så lagras ju det som 00101010.

Då är n = 42 och i = 7. Första gången i loopen så flyttas bitarna i 42 7 steg till höger. Vi får då 00000000. I praktiken innebär det att biten längst till vänster hamnar längst till höger. Sedan görs en och med 1 och det innebär att de sju bitarna längst till vänster kommer att bli noll och det är bara den sista siffran som räknas. Det returneras 1 om den är 1 eller 0 om den är 0. Den siffran som returneras skrivs ut.

Andra varvet i loopen flyttas bitarna 6 steg vilket också blir 000000 och "och" med 1 ger 0. På skärmen har det nu skrivits ut 00.

Tredje varvet kommer att flytta bitarna 5 steg och det ger 00000001. När det nu blir och med 1 så kommer det att returneras 1. På skärmen har vi 001.

Fjärde ger 00000010 och "och" med 1 ger 0. Utskriften är nu 0010.

Femte ger en tre stegs förflyttning av bitarna vilket ger 00000101 och "och" med 1 ger 0. På skärmen syns nu 00101.

Osv...

Vad man gör är alltså att man hela tiden läser av sista siffran samtidigt som man förskjuter talet så att alla siffror hamnar på sista positionen i tur och ordning.

">>" förskjuter talet och "& 1" läser av sista siffran.

Medlem sedan juni 20034 013 inlägg
#4

Psst, Phorpher, 0x var väl kanske inte det lämpligaste prefixet för binära tal eftersom det betyder hexadecimalt i C-språken.

Medlem sedan feb. 20002 300 inlägg
#5

Öh. Ja, det är helt korrekt. Jag skyller på för mycket hexrepresentation. ;) Redigerat!

Medlem sedan maj 20031 472 inlägg
#6

Jag tror jag förstår lite iaf ;)
Jag förstår bara inte riktigt varför man gör så där, när man har talet i binär form då redan....
För om man flyttar binär talet 7 steg åt sidan så har man ju redan det.
Finns det någon bra funktion för att skriva ut det direkt?

Medlem sedan feb. 20002 300 inlägg
#7

Därför att du ska skriva en funktion som skriver ut ett decimalt tal binärt. T.ex. 5 till 101.

Således måste du plocka ut varje enskild bit och skriva ut den för att få talet i binär form.

printf klarar av att skriva ut oktalt och hex så vitt jag vet. Tror inte den har någon formateringskod för binärt.

Medlem sedan maj 20031 472 inlägg
#8

Tack för hjälp med att förklara vad den koden gjorde.
Nu ska jag skriva en mycket sämre kod bara för att den där kan man inte lämna in ;)

Medlem sedan maj 20031 472 inlägg
#9

Så här löste jag det:

  int intInput;
  cout << "Tal av konvertera: ";
  cin >> intInput;
  cout << "Bin" << char(132) << "rt: ";
  for (int i = 128; i >= 1; i = i / 2) {
    if ((intInput - i) >= 0) {
      cout << "1";
      intInput = intInput - i;
    } else {
      cout << "0";
    }
  }
  cout << endl;
Medlem sedan mars 2004485 inlägg
#10

Här kan du läsa lite mer om binär aritmetik C++-manual på svenska

256 ms totalt · 3 externa anrop · v20260731065814-full.eb2a8c97
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)