拜读了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;
}