大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
输出一个数的二进制表示:
从最高位开始,依次输出。
//输出n的二进制表示
void BinaryPrint(int n)
{
    
for(int i=0; i<32++i)
    
{
        cout
<<((n&0x80000000== 0x80000000);
        n 
= n<<1;
    }

    cout
<<endl;
}


输出一个数二进制表示中1的个数:
n&(n-1)把n的最后一个变为0,因为n-1会使n最后一个1变为0,这个1后面的0变为1。
//判断n有多少位是1
int CheckBits(int n)
{
    
int ret = 0;
    
while(0 != n)
    
{
        n 
= n&(n-1);
        
++ret;
    }

    
return ret;
}


判断一个数是否为2的某次方:
特征:二进制表示中只有一位是1,其余为0。
n-1取反,为-n;若只有一位是1,则n-1后,该位之前的不变,后面位都与之前相反。
//判断n是否为2的某次方
bool CheckLog2(int n)
{
    
return (n&(-n)) == n;
}


利用类模板编译期求值优化二进制输出:
首先1字节对齐,每个struct包含两个成员,本位的值和下一位的struct,最后一个struct的本位值为0,这样data<32>就包含了33个字节,从最高位到最低位,还有个0。
将data<32>解释成为一个字符串输出,即为结果。
#include <iostream>

//1字节对齐
#pragma pack( push )
#pragma pack( 
1 )
//类模板
template<int num ,int x>
struct data
{
    data():c(enumData)
{}
    
enum { enumData = (x&0x80000000)?'1':'0' };
    
char c;                                //本位
    data< (num -1), (x<<1> SubData;    //下一位
    
}
;

//类模板特化
template<int x>
struct data<0,x>
{
    
char c;            //以0为结尾
    data():c(0){}
}
;
#pragma pack( pop )

int main()
{
    data
<32,0x80000011> temp;
    printf(
"%s\n",&temp);

    std::cout
<<sizeof(data<6,-4>)<<std::endl;        //7
    return 0;
}
posted on 2009-06-22 14:44 大胖 阅读(483) 评论(0)  编辑 收藏 引用 所属分类: Algorithm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理