二进制状态压缩基础

拜读了lyd的新书。对位运算这一节的某些技巧以10010为例自己实现了一下,记录于此,不足之处还请提出批评。

#include<cstdio>

int turnten(int n)//二进制转十进制
{
	return n==1?1:turnten(n/10)%10*2+n%10;
}
int turntwo(int n)//十进制转二进制 
{
	return n==1?1:turntwo(n/2)*10+(n&1);
}
int main()
{
	int n=10010;
	int m=turnten(n); 
	printf("%d\n",m);//18,注意以下操作要使用m去位运算,且都是从第0位算起的 
	
	//(n>>k)&1操作 
	for(int i=0;i<5;i++)//取出二进制的第i位
		printf("%d ",(m>>i)&1);//0 1 0 0 1
	
	//n&((1<<k)-1)操作 
	printf("\n%d\n",turntwo(m&((1<<3)-1))); //取出后三位,即010
	
	//n^(1<<k)操作 
	printf("%d\n",turntwo(m^(1<<2)));//将第2位取反,即变成10110
	
	//n|(1<<k)操作 
	printf("%d\n",turntwo(m|(1<<3)));//将第3位赋值为1,即11010
	
	//n&(~(1<<k))操作
	printf("%d\n",turntwo(m&(~(1<<1))));//将第1位赋值为0,即10000
	
	//n&(~n+1)操作
	printf("%d\n",turntwo(m&(~m+1)));
	//lowbit运算,取出非负整数m在二进制表示下最低位的1以及它后面的0构成的数的值,此处会输出:10
	
	//求解第几位有数字1
	int h[1<<4];
	for(int i=0;i<=4;i++)
		h[1<<i]=i;//初始化标注若有1则它该出现在哪儿
	while(m>0)
	{
		printf("%d ",h[m&-m]);
		m -= m&-m;
		//m&-m操作,等同于m&(~m+1),此处会输出1 4 
	} 
	 
	return 0;
}

阅读更多
个人分类: 复习题 常用技巧
上一篇POJ-3276:Face The Right Way
下一篇POJ-3279:Fliptile
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭