Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 04:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



(! (zufallszahl 1L)) ???

Discussion on (! (zufallszahl 1L)) ??? within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: May 2012
Posts: 23
Received Thanks: 1
(! (zufallszahl 1L)) ???

Hallo epvpler^^

Hab mal ne kleine Frage und wollt mich jetzt nicht irgendwo anders anmelden und deshalb frag ich mal kurz hier:

Und zwar versteh ich diese Funktion nicht:

Code:
int get_ungerade()
{
	int zufallszahl;
	zufallszahl = rand()%10000;
	if(! (zufallszahl & 1L)) return zufallszahl + 1;
	else return zufallszahl;
}
zufallszahl ist ja soweit ich das verstehe eine zahl von 0 bis 9999. Bei einer geraden Zufallszahl geht das Programm in den if-Zweig und bei einer ungeraden in den else-Zweig. Woher weißt das Programm denn in welchen Zweig es soll?

Hab zum testen mal paar ausgaben gemacht:
!400 ist gleich 0
!401 ist gleich 0
1L ist gleich 0

Ergo ist jede !Zahl gleich 0. Und in der Bedingung steht immer:
(!(0 & 0)) --> (!(false & false)) --> (!false) --> (true)

Bitte um Erklärung! Ich blicke überhaupt nimmer durch. Und wieso wird 1L verwendet? Das ist doch nur eine 1 als long gespeichert oder?

P.s.: Habe vor einer Woche erst mit C++ angefangen und kannte bisher nur die Grundlagen in Java. Also bitte nur leicht zu verstehende Erklärungen xD
-Epitaph- is offline  
Old 07/30/2012, 15:23   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Code:
int get_ungerade()
{
	int zufallszahl;
	zufallszahl = rand()%10000;
	if(! (zufallszahl & 1L)) return zufallszahl + 1;
	else return zufallszahl;
}
die funktion liefert eine ungerade "zufallszahl" zurück.
dazu wird rand() aufgerufen, die einen int zwischen 0 und RAND_MAX zurückliefert.
dann wird mit dem modulo operator (%) durch 10000 geteilt und der rest genommen.
dadurch ist die zufallszahl auf jedenfall zwischen 0 und 9999, da der rest die 10000 natürlich nicht erreichen kann.
dann wird mit dem binären und operator (&) geguckt ob das erste bit binär nicht gesetzt ist.
binäre zahlen haben immer das letzte bit gesetzt wenn sie ungerade sind.
wenn also festgestellt wird, dass die zahl gerade ist, da das letzte bit nicht gesetzt ist, wird ergebnis+1 returnt, ansonsten direkt das ergebnis.

Das gleiche hätte man auch erreichen können indem man in der if bedingung:
Code:
if (zufallszahl % 2 == 0)
geprüft hätte.
das prüfen eines bits sollte aber idr. schneller gehen als eine modulo operation, optimiert der compiler vllt auch.
Dr. Coxxy is offline  
Thanks
1 User
Old 07/30/2012, 15:26   #3
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Mit der AND-Maskierung (zufallszahl & 1L) wird das niedrigste bit von zufallszahl angeschaut. Ist dieses 1, so liefert der Ausdruck 1 zurück. Ist das niedrigste Bit 0, so liefert der Ausdruck 0 zurück. Mit dem ! negiert man den Wahrheitswert. Aus Falsch (0) wird Wahr (1). Aus Wahr (1) wird Falsch (0). Der If-Zweig wird also genommen, wenn die Bedingung wahr ist. dazu muss die AND-Maske 0 zurückgeben. Das niedrigste Bit ist also 0. Wenn das niedrigste Bit einer Integer-Zahl 0 ist, so ist die Zahl gerade. Dann addiert man eins drauf und erhält eine ungerade zahl. Andernfalls, wenn das niedrigste Bit 1 ist, so ist die Zahl ungerade und man kann sie so einfach zurückgeben.

EDIT: fu zu langsam
xNopex is offline  
Thanks
1 User
Old 07/30/2012, 15:32   #4
 
elite*gold: 0
Join Date: May 2012
Posts: 23
Received Thanks: 1
Achso danke klingt logisch ^^
ans Binärsystem hab ich garnet gedacht...
Und ich nehme an das !zufallszahl (auch gerade zahlen) in der Konsole immer 0 ausgibt weil die zufallszahl >= 1 war. Und 1L ist einfach nur schwachsinnig oder?^^
-Epitaph- is offline  
Old 07/30/2012, 15:48   #5
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
jop.
das L steht für long, und ja ist eigtl unnötig.
Dr. Coxxy is offline  
Old 08/07/2012, 10:23   #6


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Da es sich hier um den binären & Operator handelt und nicht um den logischen, kannst du das nicht einfach so
Quote:
Ergo ist jede !Zahl gleich 0. Und in der Bedingung steht immer:
(!(0 & 0)) --> (!(false & false)) --> (!false) --> (true)
auswerten. Da musst du, wie die anderen schon gesagt haben, binär rangehen.
Du kannst also nicht jeden Ausdruck für sich bewerten, da das ganze keine logische Verknüpfung von zwei Bedingungen, sondern eine arithmetische Berechnung ist.
MrSm!th is offline  
Reply


Similar Threads Similar Threads
Zufallszahl warscheinlichkeitsbereich beeinflussen.
07/30/2010 - General Coding - 2 Replies
Gehen wir davon aus ich möchte eine Zufallszahl generieren welche innerhalb einer gewissen Zahlenmenge liegt. Innerhalb dieser Zahlenmenge soll aber eine Zahlenmenge sein welche doppelt so häufig auftritt wie die Restmenge, wie bewerkstellige ich dies? Also ich erschaffe eine Zufallszahl zwischen 1 und 4 var x; x = Random(1, 4); So.



All times are GMT +1. The time now is 04:43.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.