翻转指定范围内的二进制位
任务描述本关任务:程序填空,写一个表达式,将int整数x从第p位开始的向右n位(p从右至左编号为0~31)翻转(即1变为0,0变为1),其余各位保持不变。例如:
输入x的值:1234(对应二进制为00000000 00000000 00000100 11010010);
输入p的值: 15 ,输入n的值: 8 ,
表达式完成计算后,x的值改变成:64466 (对应二进制为00000000 00000000 11111011 11010010)。
根据提示,在右侧编辑器Begin-End中填写表达式(只是一行或几行,不用给出完整程序,p和n已经定义好了),表达式完成计算后,使得x的值改变成任务要求的结果。,其中 0 <= n <= p + 1, 0 <= p <= 31。
本帖最后由 xieglt 于 2020-10-23 09:22 编辑
#include <stdio.h>
int main()
{
int i,p,n;
int mask;
unsigned long num;
printf("Please input X:");
scanf("%u",&num);
printf("Please input p,n:");
scanf("%d,%d",&p,&n);
if(p < 0 || p >31)
{
printf("p inputerror!0<=p<=31\n");
return-1;
}
if(n < 0 || n > p +1)
{
printf("n input error! 0<=n<=p+1\n");
return -1;
}
for(i = 0 ; i < n ; i++,p--)
{
mask = 1 << p;
mask &= num;
if(mask == 0)
{
mask = 1 << p ;
num |= mask;
}
else
{
mask = ~mask;
num &= mask;
}
}
printf("%u",num);
return 0;
} 本帖最后由 yuxijian2020 于 2020-10-23 10:23 编辑
#include <iostream>
#include <windows.h>
#include <vector>
#include <ctime>
using namespace std;
int revers(int x, int p, int n)
{
int temp = 0;
for(int i = 0; i < (p + 1); i++) //如果数字bit位超过p位,就是p左边还有数据,直接无视
{
if(i < n + 1) //需要翻转的每个bit位上都置1
{
temp = temp << 1; //先左移1位
temp += 1; //然后加1
}
else
{
temp = temp << 1; //不需要翻转的位置上置0,直接左移
}
}
temp ^= x; //对临时变量异或,结果就是答案
return temp;
}
int main(int argc, char const *argv[])
{
int x = 1234;
int result = revers(x, 15, 8);
cout << result << endl;
system("pause");
return 0;
}
发不了截图反正结果是对的 0.0{:9_217:}
页:
[1]