ARM当即数判断

      (转)怎么快速判断一个数是不是当即数,对于简单的数字咱们能够直接判断,好比小于255的数字确定是当即数。对相对复杂的数字进行判断就须要先把它转换为2进制形式,而后根据定义进行判断了。我这里总结了个比较快速的方法:spa

一、把数据转换成二进制形式,从低位到高位写成4位1组的形式,最高位一组不够四位的,在最高位前面补0。class

二、数1的个数,若是大于8个确定不是当即数,若是小于等于8进行下面步骤。循环

三、若是数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。 二进制

四、找到最高位的1,去掉前面最大偶数个0。方法

五、找到最低位的1,去掉后面最大偶数个0。总结

六、数剩下的位数,若是小于等于8位,那么这个数就是当即数,反之就不是当即数。数据

(1)0x4FF (2)0x122 (3)0x234 (4)0xF000000F (5)0x8000007F数字

(1)   1>  0x 0100 1111 1111  

           2> 1的个数大于8,不是当即数

(2)   1>  0x 0001 0010 0010    

           2>1的个数小于8    

            3>知足  

           4>1前面3个0,去掉最高偶数位,还有1个0      0x 01 0010 0010 

           5>最低位1后面1个0,故不变     0x 01 0010 0010  

           6>还剩10位,不知足,不是当即数

(3) 1>  0x 0010 0011 0100  

        2>  1的个数小于8 

        3>知足

        4> 0x 10 0011 0100

         5> 0x 10 0011 01

         6>还剩8位,知足,是当即数

(4)1>0x 1111 0000 0000 0000 0000 0000 0000 1111

        2>知足

        3>循环左移4位    0x 0000 0000 0000 0000 0000 0000 1111 1111

         4>  0x1111 1111

         5>不变

         6>还剩8位,知足,是当即数

(5)   1>0x1000 0000 0000 0000 0000 0000 0111 1111

        2>知足

        3>24个0,   则变为 0x 0000 0000 0000 0000 0000 0111 1111 1000

        4>  0x  0111 1111 1000

        5> 0x   0111 1111 10    

         6> 0x  0111 1111 10   大于8位,不是当即数

固然,最简单的写法就是:  ldr   r1, =xxx      

相关文章
相关标签/搜索