现在的位置: 首页 > 综合 > 正文

腾讯面试题之整数二进制替换

2013年02月21日 ⁄ 综合 ⁄ 共 1197字 ⁄ 字号 评论关闭

题目:对于某个int型的整数,将其二进制表示的001替换为011


解题思路:该题为tencent面试题。能够想到的思路是讲int型数与7进行与操作,若结果为1,则进行替换,否则进入下次比较。由于int型整数A负数可能性的存在,故而不能使用将A进行右移(一般编译器对于有符号的数据的右移操作为算术移位,即最高位补最高位的拷贝,例如:负数A=0xffffffffc为-4,那么A>>1,则为-2而非0x7ffffffffe)。若是将A进行左移操作的话,那么会丢失最高位。最后合适的方法是将7进行左移,逐位与A进行与操作,若不为1,则将7左移一位。若为1,则将7左移三位,并完成001到011的替换。因为左移1位和左移2位都肯定不会和001。这里的左移多少位,和KMP算法挺像。001替换为011,我只需要改一个bit位就行了。

原理演示实例:

1 0 1 0 0 1 1 0 1 0
(1)        1 1 1  &操作结果不为1,则111左移1位;
(2)       1 1 1   &操作结果不为1,则111左移1位;
(3)      1 1 1    &操作结果不为1,则111左移1位;
(4)    1 1 1      &操作结果不为1,则111左移1位;
(5)   1 1 1       &操作结果为1,则111左移3位;
(6)  1 1 1        &操作结果不为1,则111左移1位;
(7) 1 1 1          &操作结果不为1,则111左移1位;
(8)1 1 1          &操作结果不为1,则111左移1位;

具体实现代码如下:

/*
*****************************************************
	Author:GS<song0071000@126.com>
	CreateTime:2013/8/28
	Descript:replace some bits in a num
*****************************************************
*/                                                                                                                                                                             
/*we cannot make right shift because of signed number*/                                                                                                                       
int bitreplace(int num)                                                                                                                                                       
{                                                                                                                                                                             
        int filter = 7;                                                                                                                                                       
        unsigned int shift = 0;                                                                                                                                               
        unsigned int wholeshift=0;                                                                                                                                            
        while(wholeshift<=(sizeof(int)*8-3))/*the filter can right shift 29 at most.*/                                                                                                                                                 
        {                                                                                                                                                                                                                                                                                                               
                if((num&(filter<<wholeshift))==(1<<wholeshift))/*match!*/                                                                                                          
                {                                                                                                                                                             
                        /*do replace*/                                                                                                                                        
                        num |= (1<<(wholeshift+1));/*replace 001 with 011*/                                                                                                           
                        shift =3;                                                                                                                                             
                }                                                                                                                                                             
                else
				{
					shift = 1;
				}
				wholeshift +=shift;
        }                                                                                                                                                                     
        return num;                                                                                                                                                           
}  

如有其它更好方法,欢迎讨论!

本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008

抱歉!评论已关闭.