2016-04-20 10 views
0

Ich erhalte unerwartete Ergebnisse (wahrscheinlich aufgrund meines Missbrauchs oder Missverständnisses, wie ein bitweises (&) Ausdruck funktionieren soll). Ich habe folgenden Code:C# Unerwartete Ergebnisse von bitweisem (&) Ausdruck

string sbin = "10010110"; // 150 = ‭‭1001 0110‬‬ 

uint ival = Convert.ToUInt32(sbin, 2); 
ival.Dump(); // 150 Expected Correct 

uint lval = ival << 16; // Shift 16 bits left 
lval.Dump(); // 9830400 - Expected Correct 

string slval = Convert.ToString(lval, 2); 
slval.Dump(); // 0000 0000 1001 0110 0000 0000 0000 0000 - Expected Correct 

uint lrval = lval & ival; // <--- This is where I am confused (while a '+' operator works, why does the & not return the proper result?) 

// expecting 0000 0000 1001 0110 0000 0000 1001 0110 (aka ‭9830550‬ (dec)) 
lrval.Dump(); // returns 0, 

Ich bin auf der Suche nach einer Erklärung, wo meine Logik versagt. Mein Ende Ausdruck, den ich zu erreichen bin auf der Suche nach ist:

uint xpos = 150; 
uint ypos = 150; 
uint val = ((xpos) & ((ypos) << 16))); // result is 0, should be 9830550‬ as above) 

Natürlich

((xpos) + ((ypos) << 16))); // Would work properly 

jedoch alle Beispiele I (für die Zwecke der Mausposition gesehen haben (POINT) Standorten haben ‚&‘ gezeigt in der Ausdruck)

+2

'&' gibt die Bits zurück, die in beiden Werten gesetzt sind. 150 und 9830400 haben keine gemeinsamen Bits, also erhalten Sie 0. Sie suchen nach '|', die Bits zurückliefern, die auf * entweder * value gesetzt sind. Beachten Sie, dass das nicht das Gleiche wie Zusatz ist ... für ex. '1 | 1 wird gleich 1, da in beiden Werten die gleichen Bits gesetzt sind. –

+2

Sie haben bitweise UND und bitweise ODER verwechselt. Verwenden Sie '|' anstelle von '&'. – willaien

+0

Ahh ja das macht Sinn. Ich verstehe, also meine Verwirrung besteht in dem Beispiel (Antwort), das in http://stackoverflow.com/questions/10279812/simulate-click-into-a-hidden-window zur Verfügung gestellt wird. Zeige: PostMessage (hwndWindowTarget, WM_RBUTTONUP, 0, (pt.x) & ((pt.y) << 16)); // Das sollte technisch falsch sein dann –

Antwort

5

Hier ist die binäre Darstellung der zwei Zahlen:

00000000 00000000 00000000 10010110 
00000000 10010110 00000000 00000000

Also sollte es hoffentlich ziemlich klar sein, dass es in beiden Zahlen kein Bit geben wird, das 1 ist, wenn Sie also ein bitweises UND dieser Zahlen machen, kommt es auf 0 hinaus.

+0

Danke Servy, nachdem ich den Kommentar von @Glorin Oakenfoot in der Frage gelesen habe (sowie Ihre Antwort, die Sinn hätte ich hätte sofort gesehen werden), Jede Chance, die Sie erklären können, warum anderer Stack-Überlauf (aus meinem Kommentar) zeigt die Verwendung von & then (von denen es auch andere ähnliche Fragen/Antworten gibt) –

+0

@AaronMurray Sie könnten verschiedene Daten haben, in denen die UND-Werte sinnvoll sind, oder es könnte ein Fehler sein. – Servy

+0

Ja, das alles hat angefangen, weil ich den Ausdruck (von der anderen Stapelüberlauffrage) benutzt habe und die Maus an Position 0, 0 gezeigt hat. Also habe ich es abgebrochen, um zu sehen, warum es nur 0 zurückgibt und nicht was ich erwartet habe . Also werde ich mit einem Bug gehen (und ich werde die MSDN-Dokumentation erneut überprüfen, um die tatsächliche Darstellung der Daten zu bestätigen). Allerdings habe ich dies als richtig markiert, weil es die ursprüngliche Frage wie gefragt beantwortet (und die ich wusste aber nur abgelenkt vom "Käfer" und damit verwirrt) –

Verwandte Themen