题目:对于某个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