鱼C论坛

 找回密码
 立即注册
查看: 1779|回复: 2

[已解决]翻转指定范围内的二进制位

[复制链接]
发表于 2020-10-23 08:32:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
任务描述
本关任务:程序填空,写一个表达式,将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。
最佳答案
2020-10-23 09:16:54
本帖最后由 xieglt 于 2020-10-23 09:22 编辑
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i,p,n;
  5.         int mask;
  6.         unsigned long num;
  7.        
  8.         printf("Please input X:");
  9.         scanf("%u",&num);
  10.         printf("Please input p,n:");
  11.         scanf("%d,%d",&p,&n);
  12.        
  13.         if(p < 0 || p >31)
  14.        {
  15.             printf("p input  error!  0<=p<=31\n");
  16.             return  -1;
  17.        }

  18.         if(n < 0 || n > p +1)
  19.         {
  20.              printf("n input error! 0<=n<=p+1\n");
  21.              return -1;
  22.         }

  23.         for(i = 0 ; i < n ; i++,p--)
  24.         {
  25.                 mask = 1 << p;
  26.                 mask &= num;
  27.                
  28.                 if(mask == 0)
  29.                 {
  30.                         mask = 1 << p ;
  31.                         num |= mask;
  32.                 }
  33.                 else
  34.                 {
  35.                         mask = ~mask;
  36.                         num &= mask;
  37.                 }
  38.         }

  39.         printf("%u",num);       
  40.         return 0;
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-23 09:16:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-10-23 09:22 编辑
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i,p,n;
  5.         int mask;
  6.         unsigned long num;
  7.        
  8.         printf("Please input X:");
  9.         scanf("%u",&num);
  10.         printf("Please input p,n:");
  11.         scanf("%d,%d",&p,&n);
  12.        
  13.         if(p < 0 || p >31)
  14.        {
  15.             printf("p input  error!  0<=p<=31\n");
  16.             return  -1;
  17.        }

  18.         if(n < 0 || n > p +1)
  19.         {
  20.              printf("n input error! 0<=n<=p+1\n");
  21.              return -1;
  22.         }

  23.         for(i = 0 ; i < n ; i++,p--)
  24.         {
  25.                 mask = 1 << p;
  26.                 mask &= num;
  27.                
  28.                 if(mask == 0)
  29.                 {
  30.                         mask = 1 << p ;
  31.                         num |= mask;
  32.                 }
  33.                 else
  34.                 {
  35.                         mask = ~mask;
  36.                         num &= mask;
  37.                 }
  38.         }

  39.         printf("%u",num);       
  40.         return 0;
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-23 09:29:25 | 显示全部楼层
本帖最后由 yuxijian2020 于 2020-10-23 10:23 编辑
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <vector>
  4. #include <ctime>

  5. using namespace std;

  6. int revers(int x, int p, int n)
  7. {
  8.    int temp = 0;

  9.     for(int i = 0; i < (p + 1); i++)              //如果数字bit位超过p位,就是p左边还有数据,直接无视
  10.     {
  11.         if(i < n + 1)                           //需要翻转的每个bit位上都置1
  12.         {
  13.             temp = temp << 1;               //先左移1位
  14.             temp += 1;                      //然后加1
  15.         }
  16.         else
  17.         {
  18.             temp = temp << 1;               //不需要翻转的位置上置0,直接左移
  19.         }
  20.     }

  21.     temp ^= x;                          //对临时变量异或,结果就是答案

  22.     return temp;
  23. }

  24. int main(int argc, char const *argv[])
  25. {
  26.     int x = 1234;
  27.     int result = revers(x, 15, 8);

  28.     cout << result << endl;

  29.     system("pause");
  30.     return 0;
  31. }
复制代码


发不了截图  反正结果是对的   0.0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表