题目:一个整型数n,要把它的二进制形式的第i位与j位调换?(要求:用位运算)
刚拿到手感觉,应该不会太难,但做到把这两个位提取后,再想交换时,思路卡着了!最后看看论坛上别人的答案(不止一个,但这个我比较满意,下面这个算法是CSDN中用户名为:zecard_fu提供的),感觉眼前豁然一亮:
- int im = 1<<i-1;
- int jm = 1<<j-1;
- if ((n&im)==0 ^ (n&jm)==0)
- //也可换成:((n&im)==im^(n&jm)==jm)
- {
- n ^= im;
- n ^= jm;
- }
这个算法不算难,有一点C基础的都能看懂!
事后我没再惊奇此算法的简练,而是自责自己为什么没有想到,想想自己自从半年前知道二级C过了之后,就再也没认真地看过关于C方面的书籍.看看自己都在干些什么:追求各种证书,为了应试而编程而学习,学过的东西不愿意去回顾,这是自己最大的失误,殊不知:温故而知新,然而自己却没做到.现在发现复习也是一种新的学习!长期不回顾书本也是一种落后!
自己以后要做适当调整,古人云:术业有专攻!
自己该专攻,而不是全攻!