Determinați dacă un număr se află în secvența binară 1 2 4 8 16 32 64 etc. [duplicate] (Programare, C#,.Net, Math, Binar)

Shimmy Weitzhandler a intrebat.

Posibil duplicat:
Cum se verifică dacă un număr este o putere a lui 2

Vreau să determin dacă un număr este în


1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
...

Am încercat acest lucru:

public static void Main(string[] args)
{            
    int result = 1;  
    for (int i = 0; i < 15; i++)
    {          
        //Console.WriteLine(result);
        Console.WriteLine(result % 2);
        result *= 2;

    }  
}

După cum puteți vedea se întoarce
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

Cum ar trebui să fac în mod eficient ca imprimarea de mai sus să fie 0 pentru toate numerele, inclusiv pentru 1?

Comentarii

  • Da, văd asta. Este ceva în neregulă? –  > Por BoltClock.
  • Știu că codul funcționează conform așteptărilor. Întrebarea mea este ce cod să scriu pentru a imprima ce I se așteaptă. –  > Por Shimmy Weitzhandler.
  • @CodeInChaos, am votat eu însumi să o închid. Mulțumesc pentru referință. –  > Por Shimmy Weitzhandler.
  • Pentru întrebări de fiddling bit, există adesea un răspuns la: www-graphics.stanford.edu/~seander/… –  > Por CodesInChaos.
9 răspunsuri
Sam Greenhalgh

Următoarea expresie ar trebui să fie adevărată dacă i se află în secvența ta.

(i & (i-1)) == 0)

http://rextester.com/JRH41036

Comentarii

  • acesta este un site foarte util pentru a ști despre. –  > Por Antony Scott.
  • @zapthedingbat, da. este exact ceea ce căutam. –  > Por Shimmy Weitzhandler.
Øyvind Bråthen

Ce zici de ceva de genul acesta?

bool IsInBinarySequence( int number ){
  var numbertocheck = 1;
  do{
if( number == numbertocheck ) return true;
numbertocheck *= 2;
  }while( numbertocheck <= number );
  return false;
}

Acest lucru nu are o limită specifică asupra numărului de verificat, dar se asigură că se oprește verificarea dacă numărul de verificat crește mai mult decât numărul real pe care încercăm să decidem dacă se află în secvența binară.

MByD

Deoarece rezultatul de prima dată este impar, veți obține 1, , deoarece imediat după aceea se înmulțește cu 2, se va obține întotdeauna 0.

Trebuie să imprimați result dacă doriți să obțineți lista puterilor lui 2.

Console.WriteLine(result);

Un mod primitiv de a face acest lucru va fi:

public static void Main(string[] args)
{            
    int result = 1;  
    int numToCheck = 141234;
    boolean found = false;
    for (int i = 0; i < 15; i++)
    {          
        if (numToCheck == result) {
            found = true;
            break;
        }
        result *= 2;
    }  
    if(found) Console.WriteLine("Awesome");
}

Comentarii

  • Ceea ce vreau este doar să determin dacă result este din secvența binară 1, 2, 4, 8 etc. –  > Por Shimmy Weitzhandler.
  • Se pare că nu vrea să scrie lista respectivă, ci să știe dacă un anumit număr face parte din acea secvență, dar este destul de greu de înțeles având în vedere codul său. –  > Por Øyvind Bråthen.
  • Exact asta faceți. Rezultatul este 1 în prima execuție, apoi 2, apoi 4, apoi 8, apoi 16, apoi 32, apoi 64 și așa mai departe. –  > Por Sebastian P.R. Gingter.
  • Ce se întâmplă dacă numărul de verificat este mai mare de 2^15? –  > Por Øyvind Bråthen.
  • @ØyvindKnobloch-Bråthen – acesta este doar un exemplu primitiv, am încercat să clarific ideea. nu să ofer o implementare completă. –  > Por MByD.
Dennis Traub

Puteți determina dacă un număr este o putere a lui 2 (inclusiv 2^0) folosind următoarea metodă:

public bool IsPowerOfTwo(int x) {
    return (x > 0) && ((x & (x - 1)) == 0)
}

Aici puteți citi de ce și cum funcționează acest lucru.

Comentarii

  • Woops, adevărat. Am înțeles complet greșit, voi actualiza. … Gata. –  > Por Dennis Traub.
  • Eu aș folosi x>=0, , astfel încât toate numerele negative să fie respinse. Sau aruncați un ArgumentOutOfRangeException if x<0. –  > Por CodesInChaos.
  • @CodeInChaos mulțumesc, modificat în consecință. Ca o alternativă, ați putea utiliza un parametru de tip uint. –  > Por Dennis Traub.
Antony Scott

Este un pic cam complicat, dar funcționează …

    static void Main()
    {
        for (int i = 0; i < 40; i++)
        {
            var str = Convert.ToString(i, 2);
            var bitCount = str.Count(c => c == '1');
            Console.ForegroundColor = bitCount == 1 ? ConsoleColor.White : ConsoleColor.DarkGray;
            Console.WriteLine(i + ": " + (bitCount == 1));
        }
    }

se pare că, de fapt, întrebați dacă doar un singur bit din reprezentarea binară a numărului este un 1

Comentarii

  • De ce se amestecă culoarea într-o metodă care verifică dacă un număr se află într-o anumită serie de numere? –  > Por Øyvind Bråthen.
  • pentru că este un exemplu și m-am gândit că ar ajuta la evidențierea momentului în care condiția a fost îndeplinită –  > Por Antony Scott.
  • Se pare că nu am citit corect aici. Nu am văzut că ai setat culoarea de prim-plan a consolei. Atunci pare în regulă 🙂 –  > Por Øyvind Bråthen.
Yahia

Ceea ce faci tu nu este un test dacă numărul este în secvență, DAR este un generator pentru astfel de numere… doar partea de imprimare conține un fel de test…

Încercați acest cod pentru un test:

public static void Main(string[] args)
{            
    int result = 0;  
    int numToTest = 0;
    if ( int.TryParse (args[0], out numToTest) )
    {
       result = ((from c in Convert.ToString (numToTest, 2) where c == '1' select c).Count() == 1 ) ? 1 : 0;
    }

    Console.WriteLine(result);
}

Codul de mai sus ia un argument din linia de comandă și îl testează dacă se află în secvența binară conform criteriului pe care l-ai postat… dacă da, tipărește 1, altfel tipărește 0.

Comentarii

  • Aceasta pare a fi o soluție bună 🙂 +1 –  > Por Øyvind Bråthen.
Sebastian P.R. Gingter

Este corect. 1 0 0 0 0 0 0 0 este secvența corectă.Rezultatul este 1 în prima buclă. 1 % 2 este 1.Apoi rezultatul *= 2 dă rezultatului valoarea 2. În următoarea buclă se execută 2 % 2 = 0. Apoi rezultatul *= 2 este 4. 4%2 este 0. 4 *= 2 este 8. 8 %2 este 0. Deoarece rezultatul este întotdeauna înmulțit cu 2, el continuă să fie în rândul puterilor lui 2 și astfel toate operațiile MOD cu 2 au ca rezultat 0. Deci totul este în regulă cu acest cod.

Ravi Gadag

Codul dvs. va imprima numai secvențe binare. deoarece aplicați MOD 2. deci fie veți obține 0 sau 1. deci va fi imprimat în secvențe binare.

Piotr Justyna
Boolean result = false;
Int32 numberToTest = 64;
Int32 limit = 15;

for (int i = 0; i < limit && !result; i++)
{
    if (Math.Pow(2, i).Equals(numberToTest))
    {
        result = true;
    }
}

Console.WriteLine(String.Format("Number {0} {1} a power of 2.", numberToTest, result ? "is" : "is not"));

Tags:, , ,