2016-12-11 9 views
1

数字を指定すると、数字のN番目の数字を修正したいと思います。例えばN番目の数字を変更します

、1237645を与えられ、私は私が考えることのできる5

唯一の方法にあると言うために、この場合は7である右から4 番目の数字を変更したいですこれを行う

N = 1237645 
fourthDigit = (N/1000) % 10  
N -= fourthDigit * 1000  // make fourth digit 0 
N += 5 * 1000     // make fourth digit 5 

しかし、これは非常に非効率的です。これには良い方法がありますか?メモリの制約のためにNを表現するために配列を使うことはできません。あなたは1回の算術演算でそれを行うことができます

+0

申し訳ありません。それは%10 – Confuse

+2

でした。これは、従来のバイナリ表現の数値でも同様に可能です。バイナリコード10進数(BCD)を使用する場合、これはビット単位のブール演算で非常に迅速に実行できますが、すべての算術演算には余分な命令が必要です。 BCDは1つの10進数を4ビットで格納するため、32ビット整数は+ 9,999,999または99,999,999までの符号なしを表すことができます。興味深いことに、古代8086には長い間サポートされていたBCDをサポートする特別な指示がありましたが、最近のx86バージョンでは廃止され放棄されています。 – Gene

+0

興味深いですね。実際には、私は4桁の数字がshortの配列で表現されているので(これはいくつかのビットが空いているので)、私の場合は効率的なメモリと同じです。私はそれを効率的に実装する方法を学ぶ必要がありますが、現時点ではビットフィールドについてしか考えられないからです。 – Confuse

答えて

1

N = 1237645 
fourthDigit = (N/1000) % 10  
N -= (fourthDigit-5) * 1000 

は、そうでない場合は、最後の行が

N += (newDigit-fourthDigit)*1000 
1

なり、> = 5 fourthDigitを提供するが、この組み込みシステムのプログラミングですか? そうなら、バイナリコード10進数(BCD)として数値を格納し、必要に応じてバイナリに変換してみてください。 BCDからバイナリへの変換は、他の方法よりも簡単です。 も参照してください:http://homepage.divms.uiowa.edu/~jones/bcd/bcd.html

ここで私の部屋にはBCDで時間を守る時計があります。この方法では、表示のために10で割る必要はありません。

関連する問題