2016-03-21 15 views
0

Ich finde schwierig zu verstehen, wie die "&" Betreiber in Bezug auf diesen Code funktioniert:C# bitweise AND-Operator ‚&‘ Logik

for(int cnt = 0; cnt < (1 << somelist.Count()); ++cnt) 
{ 
    for (int i = 0; i < somelist.Count(); ++i) 
    { 
     // 1 << 0 -- 1 -> 1 
     // 1 << 1 -- 10 -> 2 
     // 1 << 2 -- 100 -> 4 
     // 1 << 3 -- 1000 -> 8 
     // 1 << 4 -- 10000 -> 16 
     // 1 << 5 -- 100000 -> 32 

     var l = (1 << i); 
     if ((cnt & l) == 0) 
     { 
      // when is it getting here? 
      // some code to execute 
     } 

    } 
} 

, die diejenigen, die Fälle sind, wenn es eintritt, die, wenn die Bedingung und diejenigen, wo es nicht ist? und warum?

Ich habe bereits den Debugger darauf verwendet, es ist die Logik dahinter, dass es nicht klar ist. Was sie tut, ist:

e.g. 

var cnt = 0 
var l = 1 
if ((cnt & l)==0){ // true } 

var cnt = 1 
var l = 1 
if ((cnt & l)==0){ // false } 

var cnt = 1 
var l = 2 
if ((cnt & l)==0){ // true } 

var cnt = 1 
var l = 4 
if ((cnt & l)==0){ // true } 

var cnt = 3 
var l = 2 
if ((cnt & l)==0){ // false } 

var cnt = 3 
var l = 4 
if ((cnt & l)==0){ // true } 
+0

Warum probieren Sie es nicht einfach mit dem Debugger aus? – HimBromBeere

+0

Was ist der Sinn der Listen, wenn Sie nur die Anzahl verwenden? –

+2

Es heißt der Bitwise AND Operator und funktioniert wie '72 & 184 = 8' =' 01001000 & 10111000 = 00001000' –

Antwort

3

Sie benötigen, wie & bitweise und Operator Arbeit zu verstehen.

Bitwise AND Operator: &

das bitweise UND-Operator (&) vergleicht jedes Bit des ersten Operanden des entsprechenden Bits des zweiten Operanden . Wenn beide Bits 1 sind, die entsprechende Ergebnis-Bit auf 1 gesetzt Andernfalls wird das entsprechende Ergebnis-Bit auf 0.

gesetzt ist, die Dinge einfach zu halten, habe ich nur ein Byte zu erklären.

Erster Fall

var cnt = 1 
var l = 1 
if ((cnt & l)==0){ // false } 

00000001 
00000001 
=============== 
00000001 

00000001 Beim Vergleich der 1 mit null ist FALSE zurück als 1 nicht gleich null ist.

Zweiter Fall

var cnt = 1 
var l = 2 
if ((cnt & l)==0){ // true } 

00000001 
00000010 
=============== 
00000000 

00000000 Vergleicht man die 0 mit Null ist, wird return true als 0 gleich Null ist.

+0

[Hier ist ein Tut für OP] (http://www.cprogramming.com/tutorial/bitwise_operators.html) es ist für C und C++ aber Bits sind Bits. –