scikit - toy data sklearn




数字を数字に分割するより効率的な方法はありますか? (4)

LCDに表示するには数字を数字に分割する必要があります。 今私は次の方法を使用しています:

pos = 7;

do
{
    LCD_Display(pos, val % 10);
    val /= 10;
    pos--;
} while (pos >= 0 && val);

この方法の問題は、除算とモジュロ演算がMSP430マイクロコントローラでは非常に遅いことです。 この方法には、分割を伴わないか、または操作の数を減らすための代替手段がありますか?

注:私はitoaなどのライブラリ関数は使用できません。 ライブラリーは大きく、関数そのものはむしろリソースを浪費しています(サイクル数とRAM使用量の両方)。


あらかじめ定義された基数10の値を持つループで減算を行うことができます。

私のCは少し錆びていますが、このようなものです:

int num[] = { 10000000,1000000,100000,10000,1000,100,10,1 };

for (pos = 0; pos < 8; pos++) {
  int cnt = 0;
  while (val >= num[pos]) {
    cnt++;
    val -= num[pos];
  }
  LCD_Display(pos, cnt);
}

これは完全な解決策の私の試みです。 一般的なアイデアを提供するためには、グファに行く必要があります。 これは32ビット整数、符号付きまたはそれ以外の場合、0の場合に有効です。

#include <stdlib.h>
#include <stdio.h>

#define MAX_WIDTH (10)

static unsigned int uiPosition[] = {
  1u,
  10u,
  100u,
  1000u,
  10000u,
  100000u,
  1000000u,
  10000000u,
  100000000u,
  1000000000u,
};

void uitostr(unsigned int uiSource, char* cTarget)
{
  int i, c=0;

  for( i=0; i!=MAX_WIDTH; ++i )
  {
    cTarget[i] = 0;
  }

  if( uiSource == 0 )
  {
    cTarget[0] = '0';
    cTarget[1] = '\0';
    return;
  }

  for( i=MAX_WIDTH -1; i>=0; --i )
  {
    while( uiSource >= uiPosition[i] )
    {
      cTarget[c] += 1;
      uiSource -= uiPosition[i];
    }

    if( c != 0 || cTarget[c] != 0 )
    {
      cTarget[c] += 0x30;
      c++;
    }
  }

  cTarget[c] = '\0';
}

void itostr(int iSource, char* cTarget)
{
  if( iSource < 0 )
  {
    cTarget[0] = '-';
    uitostr((unsigned int)(iSource * -1), cTarget + 1);
  }
  else
  {
    uitostr((unsigned int)iSource, cTarget);
  }
}

int main()
{
  char szStr[MAX_WIDTH +1] = { 0 };

  // signed integer
  printf("Signed integer\n");

  printf("int: %d\n", 100);
  itostr(100, szStr);
  printf("str: %s\n", szStr);

  printf("int: %d\n", -1);
  itostr(-1, szStr);
  printf("str: %s\n", szStr);

  printf("int: %d\n", 1000000000);
  itostr(1000000000, szStr);
  printf("str: %s\n", szStr);

  printf("int: %d\n", 0);
  itostr(0, szStr);
  printf("str: %s\n", szStr);

  return 0;
}

別の方法は、 ダブル・ダブルを使用することです。 これはバイナリをBCDに加算とビットシフトだけで変換する方法なので、マイクロコントローラには非常に適しています。 BCDに分割した後、簡単に各番号を印刷できます


私は一時的な文字列を使用します:

char buffer[8];
itoa(yourValue, buffer, 10);
int pos;

for(pos=0; pos<8; ++pos)
    LCD_Display(pos, buffer[pos]); /* maybe you'll need a cast here */

編集:あなたはライブラリのitoaを使用することはできませんので、 私はあなたの解決策がすでに最高だと思っています

あなたはこれを見るかもしれません: Cでモジュラスを計算する最も最適化された方法





digits