用C语言判断一个数能不能当作ARM的立即数

       在ARM立即数寻址中,指令中的立即数是有一个8位的常数移动的4 位偶数位得到的,所以每一条指令都包含一个常数X和移位值Y,得到的立即数=X循环右移(2*Y)

     给定一个立即数,判断其是否合法可以分三步:首先将给定的立即数写成32位二进制的形式;然后看能不能用一个8位的二进制数包括所有含1的部分,如不能则非法;最后看这个8位二进制数能不能循环右移偶数位得到给定的立即数,不能数则非法。

     


#include <stdio.h>
#include <stdlib.h>




unsigned  int   rightmove(unsigned int num, int bit);//数字num循环右移bit位 
int judge(unsigned int num);//判断是否为立即数 




int main()
{
unsigned  int  num;
scanf("%d",&num);
int t;
t=judge(num);
t==1?printf("可以当做一个arm立即数\n"):printf("不可以当做一个arm的立即数\n");
return 0;
}




unsigned  int rightmove(unsigned int num,int bit)
{
return  num=(num<<(32-bit))|(num>>bit);
}




int judge(unsigned int num)
{
unsigned int num_temp;
int i;
for(i=0;i<32;i++)
{
num_temp=rightmove(num,i);
if((num_temp<=0x00ff)&&(i%2==0))
{
return 1;
}
}
return 0;
}



参考博客:http://blog.csdn.net/nicehuai/article/details/48001553

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值