integer c言語 表示 - 整数が偶数か奇数かをチェックするには?





15 Answers

あなたたちは効率的すぎるwaaaaaaaayです。 あなたが本当に欲しいのは次のとおりです:

public boolean isOdd(int num) {
  int i = 0;
  boolean odd = false;

  while (i != num) {
    odd = !odd;
    i = i + 1;
  }

  return odd;
}

isEvenために繰り返します。

もちろん、それは負の数では機能しません。 しかし輝きは犠牲になる...

for文 プログラミング 配列

与えられた数字がCで偶数か奇数かどうかをどうやって調べることができますか?




[ジョークモード= "オン"]

public enum Evenness
{
  Unknown = 0,
  Even = 1,
  Odd = 2
}

public static Evenness AnalyzeEvenness(object o)
{

  if (o == null)
    return Evenness.Unknown;

  string foo = o.ToString();

  if (String.IsNullOrEmpty(foo))
    return Evenness.Unknown;

  char bar = foo[foo.Length - 1];

  switch (bar)
  {
     case '0':
     case '2':
     case '4':
     case '6':
     case '8':
       return Evenness.Even;
     case '1':
     case '3':
     case '5':
     case '7':
     case '9':
       return Evenness.Odd;
     default:
       return Evenness.Unknown;
  }
}

[ジョークモード= "オフ"]

EDIT:enumに混乱する値を追加しました。




いいところは:

/*forward declaration, C compiles in one pass*/
bool isOdd(unsigned int n);

bool isEven(unsigned int n)
{
  if (n == 0) 
    return true ;  // I know 0 is even
  else
    return isOdd(n-1) ; // n is even if n-1 is odd
}

bool isOdd(unsigned int n)
{
  if (n == 0)
    return false ;
  else
    return isEven(n-1) ; // n is odd if n-1 is even
}

このメソッドは、2つの関数を含む末尾再帰を使用することに注意してください。 コンパイラがSchemeコンパイラのような末尾再帰をサポートしている場合、効率的に実装できます(while / untilループの種類に変わります)。 この場合、スタックはオーバーフローすべきではありません!




i % 2 == 0



問題のもう一つの解決策
(子供たちは投票に参加できます)

bool isEven(unsigned int x)
{
  unsigned int half1 = 0, half2 = 0;
  while (x)
  {
     if (x) { half1++; x--; }
     if (x) { half2++; x--; }

  }
  return half1 == half2;
}



// C#
bool isEven = ((i % 2) == 0);



ここでは、Javaの答えです:

public static boolean isEven (Integer Number) {
    Pattern number = Pattern.compile("^.*?(?:[02]|8|(?:6|4))$");
    String num = Number.toString(Number);
    Boolean numbr = new Boolean(number.matcher(num).matches());
    return numbr.booleanValue();
}



このやや面白い議論を読んで、私は、メインループ内の奇数と偶数をテストした現実的で時間に敏感な機能を持っていることを思い出しました。 次のように、の他の場所に投稿された整数の力関数です。 ベンチマークは非常に驚くべきものでした。 少なくともこの現実世界の関数でモジュロはより遅く 、それほど大きくなります。 勝者は、モジュロの時間の67%を必要とする広いマージンで、(または)アプローチであり、このページのどこかにはどこにも見つかりません。

static dbl  IntPow(dbl st0, int x)  {
    UINT OrMask = UINT_MAX -1;
    dbl  st1=1.0;
    if(0==x) return (dbl)1.0;

    while(1 != x)   {
        if (UINT_MAX == (x|OrMask)) {     //  if LSB is 1...    
        //if(x & 1) {
        //if(x % 2) {
            st1 *= st0;
        }    
        x = x >> 1;  // shift x right 1 bit...  
        st0 *= st0;
    }
    return st1 * st0;
}

3億回のループでは、ベンチマークのタイミングは次のようになります。

3.962 | マスクアプローチ

&アプローチ4.851

5.850%アプローチ

理論やアセンブリ言語のリストを考えている人々にとっては、これらのような議論を解決します。これは警告的な物語でなければなりません。 あなたの哲学を夢見ているよりも、天と地、ホラティオにはもっと多くのものがあります。




私はこれが文法的な砂糖であり、.netにのみ適用可能だが、拡張メソッドについては何かを知っている...

public static class RudiGroblerExtensions
{
    public static bool IsOdd(this int i)
    {
        return ((i % 2) != 0);
    }
}

今すぐあなたは次のことを行うことができます

int i = 5;
if (i.IsOdd())
{
    // Do something...
}



ビット単位の方法は、整数の内部表現に依存します。 モジュロはモジュロ演算子があればどこでも動作します。 たとえば、実際には、動的言語のようなタグ付けに低レベルのビットを使用するシステムがあるため、未処理のx&1は実際には動作しません。




ポータブル:

i % 2 ? odd : even;

ポータブルでない:

i & 1 ? odd : even;

i << (BITS_PER_INT - 1) ? odd : even;



私たちの研究の間に多くのブール代数をしなかった私たちのためのビットごとの演算子メソッドについてもっと詳しく説明するために、ここでは説明します。 多分OPにはあまり役に立たないでしょうが、なぜNUMBER&1が動作するのかを明確にする気がしました。

上の回答者のように注意してください、負の数が表される方法は、このメソッドの動作を停止することができます。 実際には、各言語が負のオペランドを扱う方法が異なる可能性があるため、モジュロ演算子メソッドを破ることさえできます。

しかし、NUMBERが常に正であることが分かっているなら、これはうまくいきます。

上のTooonyは、バイナリ(および拒否)の最後の桁だけが重要であるという点を立証しました。

ブール論理ANDゲートは、1が返されるためには両方の入力が1(または高電圧)でなければならないことを指示する。

1&0 = 0である。

0&1 = 0である。

0&0 = 0。

1&1 = 1である。

任意の数値をバイナリとして表すと(ここでは8ビット表現を使用しています)、奇数は最後に1を、偶数には0をとります。

例えば:

1 = 00000001

2 = 00000010

3 = 00000011

4 = 00000100

あなたが任意の数を取って、ビット単位のAND(&in java)を1で使用すると、00000001、= 1が返され、数字が奇数であることを意味します。 または00000000 = 0で、数字が偶数であることを意味します。

例えば

奇妙ですか?

1&1 =

00000001&

00000001 =

00000001 < - Odd

2&1 =

00000010&

00000001 =

00000000 < - 均一

54&1 =

00000001&

00110110 =

00000000 < - 均一

これがこの理由です:

if(number & 1){

   //Number is odd

} else {

   //Number is even
}

これは冗長な場合は申し訳ありません。




I execute this code for ODD & EVEN:

#include <stdio.h>
int main()
{
    int number;
    printf("Enter an integer: ");
    scanf("%d", &number);

    if(number % 2 == 0)
        printf("%d is even.", number);
    else
        printf("%d is odd.", number);
}



効率的にするには、ビット単位の演算子(x & 1)を使用しますが、2(x % 2




+ 66%高速化>!(i%2) / i%2 == 0

int isOdd(int n)
{
    return n & 1;
}

バイナリで1の場合、コードは整数の最後のビットをチェックします。

説明

Binary  :   Decimal
-------------------
0000    =   0
0001    =   1
0010    =   2
0011    =   3
0100    =   4
0101    =   5
0110    =   6
0111    =   7
1000    =   8
1001    =   9
and so on...

奇数の場合、右端のビットは常に1であることに注意してください

私たちの右端のビットビット単位のAND演算子をチェックし、リターンラインは、それが1だ場合

真と偽と考える

nn1と比較すると0001、バイナリで意味します(ゼロの数は関係ありません)。1バイトの大きさの
整数nがあるとしましょう。

それは8ビット/ 8バイナリの数字で表されます。

int n7で、それを1と比較すると、それは

7 (1-byte int)|    0  0  0  0    0  1  1  1
       &
1 (1-byte int)|    0  0  0  0    0  0  0  1
********************************************
Result        |    F  F  F  F    F  F  F  T

どのFが偽を表し、Tは真実を表す。

これは、比較し、彼らは両方とも真ならのみ右端のビットを。ですから、自動的7 & 1T rueです。

一番右の前にビットをチェックしたいのですが?

単に変更n & 1n & 2表す2 0010ようにバイナリにして。

初心者であれば16進表記を使うことをお勧めします
return n & 1;>>return n & 0x01;




Related


Tags

c   integer