ハッカーのたのしみ

■ x以下で最大の2のべき乗を求める分岐を用いない方法

#include <stdio.h>

unsigned flp2( unsigned );

void main ( void )
{
	unsigned int x = 67;    /* 試しに67 */
	
         /* ※ ↓x:67 flp2( x ):64 となります。*/
	printf( " x:%u, flp2( x ):%u\n", x, flp2( x ) );
}


/* x以下で最大の2のべき乗を求める分岐を用いない方法 */
unsigned flp2( unsigned x )
{
	x = x | ( x >> 1  );
	printf( "%u\n", x );    /* ※99  */
	
	x = x | ( x >> 2  );
	printf( "%u\n", x );    /* ※123 */
	
	
	x = x | ( x >> 4  );
	printf( "%u\n", x );    /* ※127 */
	
	x = x | ( x >> 8  );
	printf( "%u\n", x );    /* ※127 */
	
	x = x | ( x >> 16 );
	printf( "%u\n", x );    /* ※127 */
	
	return( x - ( x >> 1 ) );
}

2のべき乗でシフトしORをとる、ということをintサイズ分繰り返し、最後に1bit右シフトしたもので引く。という感じか。

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

  • 作者: ジュニア,ヘンリー・S.ウォーレン,Jr.,Henry S. Warren,滝沢徹,玉井浩,鈴木貢,赤池英夫,葛毅,藤波順久
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2004/09
  • メディア: 単行本
  • 購入: 35人 クリック: 732回
  • この商品を含むブログ (129件) を見る