3

現在、intから数字を抽出するためのコードがいくつかありますが、これをsnprintfのないプラットフォームに変換する必要があり、バッファオーバーランが心配です。私は自分のポータブルな(そして最適化された)snprintfを書き始めましたが、誰かがもっと良いアイデアを持っている場合に備えて、ここで尋ねるように言われました。

int extract_op(int instruction)
{ 
    char buffer[OP_LEN+1];
    snprintf(buffer, sizeof(buffer), "%0*u", OP_LEN, instruction);
    return (buffer[1] - 48) * 10 + buffer[0] - 48;
}

速度が非常に重要であるため、C文字列を使用しています。

4

5 に答える 5

7

instructionこの目的のために文字配列を形成する必要はありません。次のように、「上位2桁」を保持する必要があります。

int extract_op(unsigned int instruction)
{
    int first = 0;
    int second = 0;
    while(instruction) {
        second = first;
        first = instruction % 10;
        instruction /= 10;
    }
    return first + 10 * second;
}

の表現は間違っていると思いますreturnが、それはあなたがしていることを模倣しています。2番目の数字の10倍に、最初の数字を加えたものです。

速度は現在得られている速度よりもさらに優れているのではないかと思いますが、もちろん、特定のプラットフォームとコンパイラで測定するのはあなた次第です。

于 2010-08-31T04:22:25.027 に答える
2

使用sprintfは問題ないはずです。sizeof type * 3 * CHAR_BIT / 8 + 2タイプの整数を出力するのに十分な大きさのバッファですtypeCHAR_BITが8であると想定する場合、または符号なし形式のみを考慮する場合は、この式を簡略化できます。その背後にある基本的な考え方は、各バイトが10進数(または8進数)で最大3桁を占めることであり、符号とヌル終了のためのスペースが必要です。

于 2010-08-31T04:28:38.010 に答える
1

これまでのところ、最後の2桁を入れ替える答えと、最初の2桁を入れ替える答えが1つあります。"%0*u", OP_LEN出力を特定の幅に強制しているように見えます。抽出された桁の重要度は、によって事前に決定されOP_LENます。

マクロであると仮定するOP_LENと、10 ^(OP_LEN-2)を取得できます。

#define DIVISOR ( (int) ( 1.e ## OP_LEN * 0.01 ) )

次に、@ zneakの回答と同様に、

int extract_op( int instruction )
{
    instruction /= DIVISOR;
    int tens = (instruction / 10) % 10;
    int units = instruction % 10;
    return units * 10 + tens;
}

#undef DIVISOR
于 2010-08-31T04:49:43.423 に答える
0

Uは、配列に入る数字を格納できます。これは、ALEXによって説明されたコードでした。ここで私はいくつかの変数を追加しています。

int a[5];

int extract_op(unsigned int instruction)
{
int i=0;    
int first = 0;
    int second = 0;
    while(instruction) {
        second = first;
        first = instruction % 10;
        instruction /= 10;
    }
    a[i]=first;
}

これは、すべての整数が最大5桁で機能するものです。しかし、それでも動的配列を使用したい場合は、リンクリストを使用できます

于 2010-08-31T04:56:30.013 に答える
0

0および<0でも機能するはずです。

int extract_op( int instruction )
{
  int numd = 1;
  while( instruction /= 10 )
    ++numd;
  return numd;
}
于 2010-08-31T05:05:31.133 に答える