判断n是否是N的整数次方(N是2的N次方)
2014-09-24 10:48
155 查看
昨天翻了下自己以前的博客,看到这样一道题:" 判断一个数是否是4的整数次方",就想能不能用模板的方式将4扩展到2,4,8,...2^n的所有情况呢?于是将题目改为:"判断n是否是N的整数次方,其中N必须是2的整数次方且大于1,如果传的N不符合规范,则编译错误"
以下是代码实现
template <size_t N> bool isPowerOf(size_t n)
以下是代码实现
template <bool> struct StaticAssertFailed; template <>struct StaticAssertFailed<true>{ enum{ val = true};}; #define STATIC_ASSERT(exp) StaticAssertFailed<(bool)exp>::val template<size_t N> struct isPowOf2{ enum {val = !(N & (N-1))};}; template<size_t N> struct __LogOf2 { enum {val = 1 + __LogOf2<(N>>1)>::val}; }; template<> struct __LogOf2<1>{ enum {val = 0};}; template<size_t N> struct LogOf2 { enum {val = __LogOf2<N>::val}; enum {bEnsure = STATIC_ASSERT(isPowOf2<N>::val)}; }; template<size_t offset,size_t N,bool bCont> struct __Mask{ enum { val = 1 | __Mask<offset,N + offset,N < 32>::val << offset };}; template<size_t offset,size_t N> struct __Mask<offset,N,false> { enum { val = 0};}; template<size_t N> struct Mask{ enum { val = __Mask<LogOf2<N>::val,0,true>::val}; }; /* 判断n是否是N的整数次方 其中N必须是2的整数次方且大于1,如果传的N不符合规范,则编译错误 */ template <size_t N> bool isPowerOf(size_t n) { return ((n&( n-1)) ==0) && (n & Mask<N>::val); }
相关文章推荐
- offer题11 数值的整数次方&判断浮点型是否相等&降低求n次方的时间复杂度&3种错误处理方式
- 判断一个整数是否是2的n次方
- 判断一整数是否为2的阶次方数,找出最优的方法
- 给定一个整数n,判断这个整数是否是2的N次方
- 判断一个整数是否是2的N次方【转载】
- 判断n是否为a的x次方(n, a, x都为正整数)
- c语言==判断一个数是否为2的整数次方【不使用循环】(23)
- 判断一个整数是否是2的阶次方数
- 判断一个整数x是否是2的N次方。
- 判断一个整数是否是2的N次方
- 1.求一个整数的二进制中1的个数 2.判断一个数是否是2的n次方
- 判断一个数是否是4的整数次方
- 判断一个long类型正整数是否是2的n次方——华为笔试归来
- 判断一个整数是否是2的n次方
- 判断一个整数是否是n^m次方类型数据,并比较乘法和除法性能差异
- 移位运算实际应用——判断整数N是否为2的阶次方
- 判断一个数是否是2的整数次方
- c语言==判断一个数是否为2的整数次方【不使用循环】
- 判断某个整数是否为2的次方数
- 【C#】一个方法判断整数是否是2的N次方