题目:将一个二进制数倒数第M位的前N位取反
分析:假设二进制位共有8位,M=2,N=4,将倒数第M位的前N为取反,即从倒数第3位开始至倒数第6位取反通过“亦或1处理”,因为将一个比特位亦或1,会将这个比特位取反。(即不包括倒数第M位,从它的下一位开始的连续N为)
总体思想是:产生N个1,并且将这N个1放到从倒数第M+1置倒数M+N位置,再与原数据进行亦或。步骤如下:
第一步:将1左移N位,移动后的结果减1,得到从最后一位开始连续的N个1
第二步:将第一步处理后的数据左移M位,即最后一个1来到倒数第M位的前一位
第三步:将第二步处理后的数据与原数据亦或即可。
int get_num(int x, int M, int N)
{
int a = 1 << N;
a -= 1;
a = a << M;
return a ^ x;
}