2016-04-13 6 views
7

"Making a basic algorithm"の編集履歴を参照してください。 OPが質問を変えたとき、回答者の間で失望感があった。面白い答えが無効になった。だから私は、元の質問をもう一度聞かないと、答えを立てることはできません。基本アルゴリズムの作成 - より興味深いバージョン

だから、基本的に私はこれを行うための簡単な方法を見つけたい:

if(size == 2) unit /= 2; 
if(size == 2 || size == 6) unit /= 2; 
if(size == 2 || size == 6 || size == 10) unit /= 2; 

だから、基本的にはサイズが2に等しいかどうかをチェックして、すべての新しいライン、それが最後のサイズチェックに4を追加。

私は私がそこにあればこれを行うための簡単な方法をお知りになりたい256

まで行く必要があります。

+1

私はあなたにこのことを賞賛します。 –

+0

これは将来の誰かに役立つように説明的なタイトルまたは説明を付けることができますか? 「基本的なアルゴリズム」を探している人はいません。 –

+0

@Mykeどのような提案? –

答えて

9

一致するかどうかは確認番号の基本的な基準は、ここでsize/4のままであることである。これは、モジュロ演算子、%使用して検出することができます。2.次のとおりです。

size % 4 == 2 

を次に、どのように質問があります上記の例2.によってunitを分割する多数回:size == 2について

  • unit /= 8(すべての3つの条件に合致します)。
  • size == 6の場合、unit /= 4(第2の2つの条件と一致する)。
  • size == 10の場合、unit /= 2(最後の条件に一致)。

Soは少ない数、チェック最大sizeが10である場合、それは8で割って複数回、unit2^(1 + (10 - size)/4)によって分割されます。

unit >>= 1 + (10 - size)/4 

または、より一般的には:

unit >>= 1 + (max_number - size)/4 

max_number % 4 == 2これは右シフト演算子を用いて簡潔に表現することができます。

設定max_number = 254(質問に256が指定されていますが、最後の数字は254となります)、2 <= size <= 254の場合はこれを適用することに注意してください。述べたように

if ((size & 0xffffff03) == 2) 

if (size % 4 == 2 && size >= 2 && size <= 254) { 
    unit >>= 1 + (254 - size)/4; 
} 

実際に、条件式(しかし間違いなくより少ない読み出し可能)のような、より簡潔に表すことができます。 @PaulBoddingtonによって、右シフトのサイズを考慮する必要があります。ユニットがintで、シフトされたビット数が31より大きい場合、unitは単にゼロに設定する必要があります。

+1

これは 'unit 'のタイプに依存します。 'unit'が' int'ならば、シフト量は32を法として読み込まれるので、 'int p = 1 +(254 - size)/ 4;を実行する必要があります。ユニット= p> 31? 0:ユニット>> p; ' –

+0

@PaulBoddington非常に真です。 –

関連する問題