1194: ARM立即数寻址

1194 ARM立即数寻址链接

Description

在ARM处理器立即数寻址方式中,立即数是由一个8位的无符号常数(大于等于0,小于等于0xff),先扩展为32位,然后循环右移偶数位得到。所以类似0x101,0x102,0xFF1,0xFF04,0x8000007F等都是无效的立即数,而像0xFF,0x3FC,0xC000003F,0x104,0xFF0,0xFF00,0xf000000f等都是有效的立即数。 
现在给你一个32位的正整数,请你判断这个数是否是有效的立即数。
(0x12345678循环右移4位变为0x81234567。)

Input

一个正整数T (T<= 1000000),表示有T组测试数据 
每一组测试数据包含一个32位的十六进制数n (0<= n <= 0xffffffff)

Output

共T行。对于每个n,输出占一行,如果n是有效的立即数输出"YES",否则输出"NO"。

Sample Input

30xff0xFF0xF0F

Sample Output

YESYESNO

HINT

比赛时原题有错误,“大于0”应为“大于等于0”。

这道题比赛时没有看懂,赛完队友把题思路说了下, 才明白怎么回事  首先这道题思路是吧输入的32位的十六进制数化为32位的二进制就行了 

1:化成的三十二位的二进制用一个32位的char型数组存储

2:题中说每次移动偶数位, 即二,四,六....................一直到32

3:每次移动的偶数位后只需要判断前二十四位都为零说明该数就是合法的 ,这时跳出循环直接输出YES就行了; 如果循环结束都不合法 那就输出NO

具体实现看代码  代码中会有一些解释  解释的好多地方不清晰  不懂可以问我  代码是在OJ提交过的!

#include
#include
char c[16][5] = {{'1','1','1','1'}, {'1','1','1','0'}, {'1','1','0','1'}, {'1','1','0','0'},
		         {'1','0','1','1'}, {'1','0','1','0'}, {'1','0','0','1'}, {'1','0','0','0'},
				 {'0','1','1','1'}, {'0','1','1','0'}, {'0','1','0','1'}, {'0','1','0','0'},
				 {'0','0','1','1'}, {'0','0','1','0'}, {'0','0','0','1'}, {'0','0','0','0'}};
//上面的这个数组是为了方便化为二进制而初始化好的				 
int count;				 
void f(char *b, int k)
{
	int j;
	for(j = 3; j >= 0; j--)
	{
		b[count--] = c[k][j];
	}
}				 
int main()
{
	int n, i, len, j, w, flag, k, z, ok, q;
	char a[40], b[40];
	scanf("%d", &n);
	while(n--)
	{
		scanf("%s", a);
		count = 31;
		len = strlen(a);
		for(i = len - 1; i >= 2; i--)//这个循环式把输入的数化为二进制保存到字符数组中,不够三十二位
		//该循环后会有个循环将该数组补齐 
		{
			w = count;
			 if(a[i] == 'f' || a[i] == 'F') f( b, 0);
			 else if(a[i] == 'E' || a[i] == 'e') f( b, 1);
			 else if(a[i] == 'D' || a[i] == 'd') f( b, 2);
			 else if(a[i] == 'C' || a[i] == 'c') f( b, 3);
			 else if(a[i] == 'B' || a[i] == 'b') f( b, 4);
			 else if(a[i] == 'A' || a[i] == 'a') f( b, 5);	
			 else if(a[i] == '9') f( b, 6); 	 	 	
			 else if(a[i] == '8') f( b, 7);
			 else if(a[i] == '7') f( b, 8);
			 else if(a[i] == '6') f( b, 9);
			 else if(a[i] == '5') f( b, 10);
			 else if(a[i] == '4') f( b, 11);
			 else if(a[i] == '3') f( b, 12);
			 else if(a[i] == '2') f( b, 13);
		     else if(a[i] == '1') f( b, 14);
			 else if(a[i] == '0') f( b, 15);	 		 	 	 	 	 	 	 	
		}
	    for(i = 0; i<= count; i++)//该循环是把32位的字符数组补齐32位,前面补零 
	    {
	    	b[i] = '0';
	    }
	    if(count >= 23)
	    {
	    	printf("YES\n");
	    	ok = 1;
	    	continue;
	    }
	    for(i = 2; i <= 32; i = i + 2)//循环偶数次的控制 
	    {
	    	for(j = 1; j <= i; j++) //每次移的偶数次 
	    	{
	    		q = b[31]; 
	    		for(k = 30; k >= 0; k--)//每次循环右移一位 
	    		{
	    			b[k + 1] = b[k];
	    		}
	    		b[0] = q;
	    	}
	    	ok = 1;
	    	for(z = 0; z < 24; z++)
	    	{
	    		if(b[z] != '0')
	    			ok = 0;
	    	}
	    	if( 1 == ok )
	    	{
	    		printf("YES\n");
	    		break;
	    	}
					
	    }
	    if(0 == ok)
	    	printf("NO\n");
	    	
	}
	return 0;
} 


你可能感兴趣的:(c)