lightoj 1042 练一练位操作

要把数字变成1的个数相同,比这个数大的最少的一个数

我的想法就是先找到第一个01这样的序列,把1向前移动一位,然后再把位置靠前的1移动到后面的0上。

位操作:

&= 可以把某位置0 通过1110111这样子的数字

|= 可以把某位置1 通过0001000这样的数字

^ 异或,与11111异或可以取反 另外两个相同的数与另一个数异或得到另一个数 5^2^5=2

~ 按位取反

>>= 右移一位

<<= 左移一位

#include<stdio.h>


int main()
{
	int cas;
	scanf("%d",&cas);

	for(int T=1;T<=cas;T++)
	{
		int n;
		int tn;
		scanf("%d",&n);
		tn=n;
		int a=2,b=1;

		while(1)
		{
			if((a&n)==0&&(b&n)!=0)
			{

				n|=a;
				n&=(~b);
				break;
			}
			a<<=1;
			b<<=1;
		}
		int c=b;
		int d=1;
		while(c>d)
		{
			while((n&c)==0&&(c>d))
				c>>=1;
			while((n&d)!=0&&(c>d))
				d<<=1;
			if(c>d)
			{
				n&=(~c);//c的1所在位置置0
				n|=d;//d的1所在位置置1
				c>>=1;
				d<<=1;
			}
		}
		printf("Case %d: %d\n",T,n);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章