Toon posts:

Shift operators

Pagina: 1
Acties:

Verwijderd

Topicstarter
Na het een en het ander met php te hebben geprogrammeerd, heb ik mijzelf voorgenomen om C++ te leren.

ik heb nu 2 handleidingen gevonden, die ik aan het doorlezen ben, namelijk:

thinking in C++, 2nd edition 1&2

nu ben ik heb het onderdeel shift operators gekomen en ben ik de kluts kwijt. De oplossing zal wel simpel zijn ik zie het gewoon niet.

het gaat om het volgende programma :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <stdlib.h>

void printBinary(const unsigned char val) {
  for(int i = 7; i >= 0; i--)
    if(val & (1 << i))
    std::cout << "1";
    else
    std::cout << "0";
}

int main () {
    printBinary(3);
    return 0;
}

zoals de meeste van jullie zien print deze functie een binair getal van een decimaal getal.

mijn vraag, hoe werkt deze functie precies, gelet op val & (1 << i))????????????????

Verwijderd

Topicstarter
hallo, is daar iemand. |:( |:(

het is ook niet verboden om links te posten naar duidelijke C++ handleidingen en je tips door te spelen.

  • Tsjipmanz
  • Registratie: Oktober 2000
  • Laatst online: 13-05 14:52

Tsjipmanz

Der Rudi ist da

Op donderdag 23 mei 2002 12:26 schreef jorisor het volgende:

hallo, is daar iemand. |:( |:(



het is ook niet verboden om links te posten naar duidelijke C++ handleidingen en je tips door te spelen.
Daarentegen is het "not done" om je eigen topics na een uurtje weer omhoog te schoppen. Vergeet niet dat sommige mensen hier ook nog een studie of een baan hebben.

There's no such thing as a mistake, just happy accidents - Bob Ross
Relaxte muziek: altijd okee!
- Soulseek rulez -


  • Pelle
  • Registratie: Januari 2001
  • Laatst online: 02:20

Pelle

🚴‍♂️

Denk niet dat je op veel nuttige respons kan rekenen als je na amper 2 uur alweer gaat kicken.

En je hebt er toch een boek bij? Daar staat toch in wat bitwise shiften is?

Even de search gebruiken is niet moeilijk hoor:
[search=bit operators]
[search=bitwise shiften]
[topic=204345/1/25]
Enz..

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
code:
1
if( (val & (1 << i)) )

voorbeeldje dan:
code:
1
if( 1100 & (1 << 2) ) == if( 1100 & 0100 ) == if( 0100 )

En je bent wel een beetje ongeduldig jah ...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Op donderdag 23 mei 2002 13:15 schreef farlane het volgende:
code:
1
if( (val & (1 << i)) )

voorbeeldje dan:
code:
1
if( 1100 & (1 << 2) ) == if( 1100 & 0100 ) == if( 0100 )

En je bent wel een beetje ongeduldig jah ...
Hier wil ik nog aan toevoegen (mocht het nog niet duidelijk zijn) dat de & de bitwise and operator is en niet de gewone && zoals je misschien denkt. Nu moet je er wel uitkomen.

He who knows only his own side of the case knows little of that.


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
if(val & (1 << i))
Als ik het goed lees staat hier dat ie 1 i plaatsen naar links gaat schiften en dan controleren of op deze bit plaats ook een 1 staat in de variabele var.

/me weet geen leuke quote voor in zijn signature


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

jorisor:
hallo, is daar iemand. |:( |:(
wtf :D :D Da's wel de meest trieste kick die ik ooit gezien heb ;)
</offtopic>


Even een beetje uitleg:
De bitwise shift operators werken als volgt:
Elke variabele/waarde heeft een bepaalde binaire representatie. Wanneer je deze left of right gaat shiften gebeurt er simpelweg het volgende:

16 bits* drm integer met waarde 1 decimaal is binair:
code:
1
0000 0000 0000 0001

doe ik een left shift van 1 stapje:
code:
1
1 << 1;

dan is de uitkomst binair:
code:
1
0000 0000 0000 0010

geworden.
Als je dat nou in stapjes doet:
code:
1
2
for ( int i = 0; i < 7; i ++ )
   ( 1 << i )

dus, dan zie je als je de forloop uit zou schrijven het volgende gebeuren:
code:
1
2
3
4
5
( 1 << 0 )
( 1 << 1 )
( 1 << 2 )
( 1 << 3 )
etcetera

Die & operator, echter, checkt of een bepaald bit geset is of niet:
code:
1
2
3
4
5
// bijvoorbeeld:
a = 1;   // is dus 0000 0000 0000 0001 binair
b = 2;   // is dus 0000 0000 0000 0010 binair

c = ( a & b ); // c is false (of 0 afhankelijk van platform en compiler)

c wordt dus false. waarom?
code:
1
2
0000 0000 0000 0001
0000 0000 0000 0010 &

er is nergens een bit wat bij ALLEBEI (binary and) geset is. false dus.
als je nou
code:
1
2
0000 0000 0000 0001     = 1
0000 0000 0000 0011 &   = 3

zou dus true geven, want ze hebben het 1e bit gemeen.

Als die 2 dingen dus combineert, zie je dus, dat het forloopje alle bits afloopt om te kijken of het geset is. Is het geset? print dan een 1. Is het niet geset, print dan een 0.

That's basically it.

Oh, en wat misschien ook een beetje verwarrend is, is dat de << left shift operator ook gebruikt wordt bij de cout om de stream input te geven. Dat fenomeen heet operator overloading, maar daar zou ik me nog maar even niet mee bezig gaan houden ;) als je net begint :)


* drm Ik ga even uit van 16 bits, maar dat is compiler en platform afhankelijk


hth :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 06-09 22:39
Er is natuurlijk verschil tussen een uitleg en een uitleg. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op donderdag 23 mei 2002 12:26 schreef jorisor het volgende:
hallo, is daar iemand. |:( |:(

het is ook niet verboden om links te posten naar duidelijke C++ handleidingen en je tips door te spelen.
Hoi,
[topic=392390/1/25]
Policy mbt het omhoogschoppen van threads. Wacht minstens 24 uur voor je je topic omhoog schopt. Doe dit dan ook alleen met een zinnige opmerking en dus niet met "Waarom antwoord er nou niemand" nadat je 5 minuten geen antwoord hebt gehad. Sommigen van ons hebben een leven :+
<hr>
omdat je dit op de meest onbeschofte manier doet die ik ooit gezien heb gaat dit topic gewoon dicht
de volgende keer levert zoiets je gewoon een waarschuwing op

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

heropend omdat anders de mooie reply van [url="http://gathering.tweakers.net/forum/find/poster/22119]drm[/url] verloren zou gaan
ik waarschuw je nogmaals om NOOIT meer zo'n reply te doen

Doet iets met Cloud (MS/IBM)


Verwijderd

Topicstarter
bedankt voor de goede uitleg.

ook bedankt dat je deze topic niet sluit. laten we het erbij houden dat ik onzorgvuldig te werk ben gegaan en dat ik de FAQ niet goed doorgelezen heb. (ik heb ook niks te doen op mijn stage)

ik begrijp dat het zeer irritant is, maar ik kon op het moment niet verder. In het vervolg zal ik mijn vragen volgens de FAQ
doen. *D

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op donderdag 23 mei 2002 14:45 schreef drm het volgende:
code:
1
2
0000 0000 0000 0001
0000 0000 0000 0010 &

er is nergens een bit wat bij ALLEBEI (binary and) geset is. false dus.
Eigenlijk is het antwoord niet false, maar
code:
1
0000 0000 0000 0000

Dit wordt uiteindelijk wel als false gezien.
als je nou
code:
1
2
0000 0000 0000 0001     = 1
0000 0000 0000 0011 &   = 3

zou dus true geven, want ze hebben het 1e bit gemeen.
zelfde hier. Hier komt eigenlijk
code:
1
0000 0000 0000 0001

uit wat uiteindelijk als true wordt gezien. Het lijkt me handiger om dit toe te voegen aan de verder uitstekende uitleg :)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1