求最接近数n的2的次方数 |
您所在的位置:网站首页 › 转换误差不大于2的负4次方 › 求最接近数n的2的次方数 |
我们当然可以直接暴力求解(负次方不考虑): int findTableSizeof2(const int target){ if(target < 0) return 0; int power = 0, temp = target; int temp2power = 1; while(1){ temp/=2; if(temp){ power++; temp2power*=2; }else{ break; } } // 可能出现target是两者的平均值,就暂且返回大值吧 return temp2power*2 - target >= target - temp2power ? temp2power*2 : temp2power;但是前段时间看到一个通过位运算求值得方法,实在令人叹为观止: int findTableSizeof2(const int target){ int temp = target -1; temp |= temp >> 1; temp |= temp >> 2; temp |= temp >> 4; temp |= temp >> 8; temp |= temp >> 16; return (temp < 0) ? 1 : temp + 1; }乍一看可能有些蒙,我们随便取个值来分析一下,-------就827了(1100111011)。 1100111011 -1 temp: 1100111010 0110011101 temp>>1 1110111111 temp |= temp: 1110111111 此步主要为了保证第一位一定是1,如果所有位都为1,则已经是结果了 0011101111 temp >>2 11111111111 temp |= temp:1111111111 这样就保证了前两位一定是1,以此类推(虽然已经满足了)保证所有位为1 。。。。。。 但是这样并不是我们想要的结果,因为2的次方数只是高位为1,所以我们只需要再+1,就ok了。(这也是前面为什么要减一的原因)。
其实我们平时会遇到太多以2为基数的运算,此时一定要首先考虑位运算,比如以上的算法就会比暴力求解提升几百倍上千倍速度不止。常见的还有求余数运算。比如求对2的余:n%2---> n&1,对8的余:n&7 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |