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);
	}
}


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