• De afgelopen dagen zijn er meerdere fora waarop bestaande accounts worden overgenomen door spammers. De gebruikersnamen en wachtwoorden zijn via een hack of een lek via andere sites buitgemaakt. Via have i been pwned? kan je controleren of jouw gegeven ook zijn buitgemaakt. Wijzig bij twijfel jouw wachtwoord of schakel de twee-staps-verificatie in.

Vreemd resultaat bij left- en right-shift

Status
Niet open voor verdere reacties.

PageMaker

Nieuw lid
Lid geworden
28 jul 2020
Berichten
1
Waarderingsscore
0
Ik krijg een vreemd resultaat bij het toepassen van left- en right shift.
int main(int argc, const char * argv[]
{
int int_1, int_2;
long long bin_1, bin_2, result;

printf("Enter first int: ");
scanf("%d", &int_1);

printf("Enter second int: ");
scanf("%d", &int_2);

bin_1 = dec2bin(int_1);
bin_2 = dec2bin(int_2);

printf("bin_1: %lld\n", bin_1);
printf("bin_2: %lld\n", bin_2);

result = bin_1 << 1;
printf("result_1: %lld\n", result);
result = bin_2 << 1;
printf("result_2: %lld\n", result);

// Enter first int: 10
// Enter second int: 11
// bin_1: 1010
// bin_2: 1011
// result: 2020
// result: 2022
// Program ended with exit code: 0

Kan iemand deze vreemde output verklaren?
Het resultaat dat ik verwacht zou moeten zijn:
// result: 10100
// result: 10110

Ik werk met Xcode als IDE en de standaard gnu11 compiler.
 
Mocht je het nog niet opgelost hebben.
dec2bin(), zou ik pas doen na alle berekeningen. Dus eerst de shifts en dan pas dec2bin().

Aan je code te zien zet de functie dec2bin() een decimaal getal om in een getal dat eruit ziet alsof het binair is, maar eigenlijk is het een decimaal getal. De functie zet in een integer op de juiste plaats een 1 of 0. Dus hoewel het getal eruit ziet alsof in de integer een-nul-een-nul staat in binair, in werkelijkheid staat er duizendtien.

De shift doet vervolgens exact wat het doen moet: het verdubbelt je nep-binaire-getal (voor gebrek aan een beter woord). :)

Als je in een char* een binair getal wil, zou ik dat doen door het originele getal te nemen en het gelijk om te zetten naar een char* in binaire notatie. Deze functie zal je zelf moeten maken. Om het duidelijker te maken, wat ik bedoel (want ik vind dat ik het slecht uitgelegd heb) is dat je een functie maakt die er als volgt uitziet: char *dec2bin() en dus NIET (zoals je nu hebt) long dec2bin() of int dec2bin().

Zou je voortaan ook de juiste opmaak willen gebruiken voor code? Anders kan het soms lastig te volgen zijn (zeker wanneer programma's lang worden). Voor uitleg zie dit topic: Nieuwe code tag ingevoerd op het forum (Handleiding)

Als ik iets onduidelijk heb uitgelegd hoor ik het graag.

Voor de mods: sorry voor het negeren van die ene forumregel over twee weken deadline in betrekking tot antwoorden.
 
@Maarten,

Geen probleem, hopelijk heeft topic starter
er nog iets aan :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan