/*
 *	clippopc.h
 *
 *	高速ビットカウント
 *
 *	* Wed Dec 26 22:22:11 JST 2012 Naoyuki Sawa
 *	- 1st リリース。
 *	- GCCの組み込み関数 __builtin_popcount() と __builtin_parity() の互換関数を実装しました。
 *	  P/ECE開発環境のgcc33は、__builtin_popcount() と __builtin_parity() に対応していません。
 *	- popcount() は、低速でコードサイズが小さい実装と、高速でコードサイズが大きい実装を用意しました。
 *	  どちらを選択するかを考えると、実際にはさほど高速性は要求されないであろうことと、
 *	  使用頻度が低いであろうことから、低速でコードサイズが小さい実装を選択するのが適切なのですが、
 *	  勉強のために、高速でコードサイズが大きい実装を選択することにしました。
 *	  高速でコードサイズが大きい実装は、Webサイトの情報を参考にした、最速のアルゴリズムです。
 *	  低速版と高速版を比較すると、C言語版では約4倍、アセンブラ版では約2倍の速度差があります。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_POPC_H__
#define __CLIP_POPC_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	
 ****************************************************************************/

/* 値xのうち、1が立っているビット数を返します。
 * [in]
 *	x		調べる値
 * [out]
 *	戻り値		値xのうち、1が立っているビット数
 * [note]
 *	- GCCの組み込み関数 __builtin_popcount() の互換関数です。
 */
int popcount(unsigned x);
#define __builtin_popcount popcount

/* 値xの、偶数パリティを返します。
 * [in]
 *	x		調べる値
 * [out]
 *	戻り値		値xの、偶数パリティ
 * [note]
 *	- GCCの組み込み関数 __builtin_parity() の互換関数です。
 *	- 「parity(x) == (popcount(x) & 1)」の関係が成り立ちます。
 */
int parity(unsigned x);
#define __builtin_parity parity

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_POPC_H__*/
