Soru Biten işleçler kullanarak bir tamsayı mı, yoksa tek sayı mı olduğunu nasıl kontrol edebilirim


Biten işleçler kullanarak bir tamsayı mı, yoksa tek sayı mı olduğunu nasıl kontrol edebilirim


49
2018-04-18 09:29


Menşei




Cevaplar:


C (ve çoğu C benzeri diller)

if (number & 1) {
  // It's odd 
}

68
2018-04-18 09:32



efendim, program yazdım #include <stdio.h> main () {int sayı; printf ("Numarayı girin: \ n"); scanf ( "% d" ve sayı); eğer (sayı & 1) {printf ("Sayı garip \ n") ise; } else {printf ("Numara bile \ n"); }} - brisk man


"Bit" ve "garip" olmanın "bit" terimlerinde ne anlama geldiğini düşünün. İkili tamsayı verileri 2'nin katlarını gösteren bitlerle depolandığından, en düşük sipariş biti 2'ye karşılık gelir.0Tabii ki, 1 diğer bit 2 katına denk gelir (21 = 2, 22 = 4, vb.). Gösterişli ASCII sanat:

NNNNNNNN
||||||||
||||||| + −− bit 0, değer = 1 (20)
|||||| + −−− bit 1, değer = 2 (21)
||||| + −−−− bit 2, değer = 4 (22)
|||| + −−−−− bit 3, değer = 8 (23)
||| + −−−−−− bit 4, değer = 16 (24)
|| + −−−−−−− bit 5, değer = 32 (2)5)
| + −−−−−−−− bit 6, değer = 64 (26)
+ −−−−−−−−− bit 7 (en yüksek sipariş biti), değer = 128 (2)7) imzasız numaralar için,
                 değer = -128 (-27) imzalı numaralar için (2's tamamlayıcı)

Orada sadece 8 bit gösterdim, ama fikri anladın.

Yani, bir tamsayı yalnızca en düşük sıralı bit'e bakarak bile mi yoksa tek mi olduğunu söyleyebilirsin: Eğer ayarlanmışsa, sayı tuhaftır. Değilse, hatta. Diğer bitleri umursamıyorsunuz çünkü hepsi 2'nin katlarını gösteriyor, ve bu yüzden değeri tutamıyorlar.

yol Ona bak, dilin AND operatörü kullanarak. C ve sözdiziminde B'den (evet, B) türetilen diğer birçok dilde, bu operatör &. TEMELlerde genellikle And. Tamsayıyı alırsınız, ve 1 ile (en düşük sıralı bit kümesine sahip bir sayıdır) ve sonuç 0'a eşit değilse, bit ayarlanmıştır.

Kasıtlıyım değil Aslında buradaki kodu vermek, sadece kullandığınız dili bilmediğim için değil, "ev ödevi" sorusunu işaretlediğiniz için. :-)


101
2018-04-18 09:31



jim backler fikri #include <stdio.h> main () {int number; printf ("Numarayı girin: \ n"); scanf ( "% d" ve sayı); eğer (sayı & 1) {printf ("Sayı garip \ n") ise; } else {printf ("Numara bile \ n"); }} - brisk man
Açıklamanız gerçekten iyi ve tam olarak ne arıyordum :) - nbro
Bunun cevabı kabul edilmeli, çünkü bunun "başlık altında" nasıl çalıştığını açıklıyor. - codekiddy
Güzel açıklama, cevabı tamamlar. - kunal saxena
Bu cevabın kabul edilmemesi bir utanç verici! - J. Doe


if (number & 1)
    number is odd
else // (number & 1) == 0
    number is even

Örneğin, tam sayı 25 alalım, bu garip. İkili 25'de 00011001. En az anlamlı bit b0'ın 1 olduğuna dikkat edin.

00011001    
00000001   (00000001 is 1 in binary)
       &
--------
00000001

14
2017-08-11 13:39





Jim'in cevabına sadece bir dipnot.

C # 'da, C'den farklı olarak, bit değeri ve sonuçta elde edilen sayıyı döndürür, böylece yazmak isteyebilirsiniz:

if ((number & 1) == 1) {
   // It's odd
}

10
2017-08-08 16:09



C # bilmiyorum (soru yine de C etiketli), ama bu nasıl bir fark yaratıyor? number & 1 0 veya 1 döndürür. C # yazıyorsanız if (8) örneğin, 8 değerlendirmek true? - Shahbaz
Hayır, C'den farklı olarak, bir tamsayı C # içinde bir Boole'ye otomatik olarak dökülmez, böylece bir derleme hatası alırsınız: "Sabit değer '8' bir 'boole' dönüştürülemez. Bu nedenle ekstra sözdizimi. Ben bu cevabı bir “dipnot” olarak koydum, böylece bunu kullanmak isteyen insanlar bunu kullanabiliyordu. - neontapir
"C # 'de, C'den farklı olarak, bit değeri ve sonuçta oluşan sayıyı döndürür ..." Bitwise AND, sonuç numarasını C'ye de döndürür. Olmazsa işe yaramaz olur. Bu aslında if C'deki herhangi bir integral tipte çalışabilir, fakat C # değerinde değil, bitsel operatörün sonucu değil. - T.J. Crowder
Anladığım kadarıyla, C, bitly AND değeri bir Boole sonucunu döndürürken, C # değeri veya 0 değerini döndürür. OP'deki kod örneklerine bakın ve farkı görmek için cevabımı inceleyin. - neontapir
& Operatör, tam sayılarda kullanıldığında, tanım ile bir tamsayı döndürür. 8 & 1 sonuç olarak 0 verecektir. Ancak, C'de, bir if ifadesi 0'ı false ve sıfır olmayan herhangi bir sayı true değerine getirecektir. - Ragnagord


if(x & 1)                               // '&' is a bit-wise AND operator
    printf("%d is ODD\n", x);
else
    printf("%d is EVEN\n", x);

Örnekler:

    For 9:

      9 ->        1 0 0 1
      1 ->     &  0 0 0 1
      -------------------
      result->    0 0 0 1

9 VE 1 Yani bize 1 verir, her garip numarasının en çok bit 1'dir.

     For 14:

       14 ->      1 1 1 0
       1  ->   &  0 0 0 1
       ------------------
       result->   0 0 0 0

Yani 14 VE 1 bize 0 verir, her çiftin en sağı bit 0'dır.


5
2018-06-20 17:07





Bunu sadece bitsel kullanarak yapabilirsin VE & Şebeke.

if(num & 1)
{
    //I am odd number.
}

Daha fazlasını buradan oku - C'deki bitly operatörünü kullanarak tek sayıyı kontrol etme


1
2018-02-03 16:28





Ayrıca Java'da kullanmak zorunda kalacaksınız if((number&1)==1){//then odd}Çünkü Java ve C # dillerinde int dökülmez boolean. Geri dönmek için ilişkisel operatörleri kullanmanız gerekecek bir boolean değer true ve false C ve C ++ 'dan farklı olarak sıfır olmayan değeri ele alan diller gibi true.


0
2018-03-06 10:07





#include <iostream>
#include <algorithm>
#include <vector>

void BitConvert(int num, std::vector<int> &array){
    while (num > 0){
        array.push_back(num % 2);
        num = num / 2;
    }
}

void CheckEven(int num){
    std::vector<int> array;
    BitConvert(num, array);
    if (array[0] == 0)
        std::cout << "Number is even";
    else
        std::cout << "Number is odd";
}

int main(){
    int num;
    std::cout << "Enter a number:";
    std::cin >> num;

    CheckEven(num);
    std::cout << std::endl;

    return 0;
}

0
2017-10-04 00:11