鱼C论坛

 找回密码
 立即注册
查看: 1864|回复: 13

[技术交流] 大家有好的二进制算法吗?这个是想当然的做法,不理想.都来看看吧,欢迎指导

[复制链接]
发表于 2022-9-24 16:52:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 howzyao 于 2022-9-24 17:02 编辑

sshot-4.png


  1. #include <iostream>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5. using namespace std;
  6. const int max_bit = 15;
  7. void input_num(int);
  8. void process_single(int*,int*,int);
  9. void process_double(int*,int*,int);

  10. int main()
  11. {
  12.     cout << "Hello world!" << endl;
  13.     int x=0;

  14.     while(1)
  15.     {
  16.         cout<<"-----------------------------------begin"<<endl;
  17.     cout << "( x<=32767 ) 输入正数 x:   ";
  18.     cin>>x;
  19.     input_num(x);//max 32767

  20.     }

  21.     return 0;
  22. }

  23. void input_num(int x)
  24. {
  25.     int bits_value[ max_bit ];
  26.     int num_bit_save[max_bit];
  27.     for(int i=0;i<max_bit;i++)
  28.     {
  29.         num_bit_save[i]=0;
  30.         bits_value[i] = pow(2,i);
  31.     }
  32.     int max_num=0;
  33.     for(int i=0;i<max_bit;i++)
  34.     {
  35.         max_num += bits_value[i];
  36.     }

  37.     int tempx=0;

  38.     if(x<max_num+1)
  39.     {
  40.         tempx=x;
  41.         cout<<"输入的是: "<<tempx <<" (最大数: 32767)"<<endl;
  42.     }
  43.     else
  44.     {
  45.         cout<<"输入的是: "<<x<<" (最大数: 32767) 超过取值上限"<<endl;
  46.     }

  47.     int sum=0;
  48.     for(int i=0;i<max_bit;i++)
  49.     {
  50.         if(tempx==0)
  51.         {
  52.             break;
  53.         }
  54.         else if(tempx==bits_value[max_bit])
  55.         {
  56.             tempx -= bits_value[ max_bit ];
  57.             num_bit_save[max_bit-1]=1;
  58.             break;
  59.         }
  60.         else if(tempx >0 && tempx <bits_value[max_bit])// 处理1~32766
  61.         {
  62.             if(tempx%2==0)
  63.             {
  64.                 for(int j=0;j<max_bit; j++)
  65.                 {
  66.                     process_double(bits_value,num_bit_save,tempx);
  67.                     break; //跳出所有if 偶数 总是少1 未解决
  68.                 }
  69.             }
  70.             else if(tempx%2==1)
  71.             {
  72.                 for(int j=0;j<max_bit; j++)
  73.                 {
  74.                     process_single(bits_value,num_bit_save,tempx);
  75.                     break; //跳出所有if 奇数 done by 20220924
  76.                 }
  77.             }
  78.         }
  79.         break;//跳出for

  80.     }

  81.     int save=0;
  82.     cout<<"2进制数 == ";
  83.     for(int i=max_bit;i>-1;i--)
  84.     {
  85.         num_bit_save[max_bit]=0;
  86.         cout<<num_bit_save[i];
  87.         if(i%2==0)
  88.             cout<<" ";

  89.     }
  90.     cout<<"\n-----------------------------------end\n\n"<<endl;

  91.     delete bits_value,num_bit_save;
  92. }
  93. void process_double(int*bitsv,int*bsv,int n)
  94. {
  95.     int t=n;
  96.     int i=max_bit;

  97.     int record_bit=0; //记录少1时,2进制数的最高位位数
  98.     int switchs=1;


  99.     while(t>-1)  //2~32766 必然是偶数
  100.     {
  101.         if(t>bitsv[i] && switchs)
  102.         {
  103.             record_bit=i; //记录需要进1时,二进制所处的最高位 位置
  104.             switchs=0;
  105.         }


  106.         if(t>bitsv[i])
  107.         {

  108.             t -= bitsv[i]; //2~32766 必然是偶数

  109.             bsv[i]=1;

  110.         }


  111.         if( t<2 )
  112.         {
  113.             //bsv[0]=0;   //2进制 第0位 设为0 因为 2~32766 必然是偶数
  114.             //bsv[0]=0;
  115.             t=-1;        //结束处理
  116.         }

  117.         if( t==2 )
  118.         {
  119.             //t=-1;
  120.             //bsv[0]=0;
  121.             //bsv[1]=1;
  122.             //最高位进位怎么办
  123.             //最高位记录是record_bit
  124.         }

  125.         i--; //从15位到1位倒序遍历
  126.     }

  127.     //总是少一个
  128.     int choice=0;
  129.     for(int j=0;j<max_bit;j++)
  130.     {
  131.         if(bsv[j]==1)
  132.         choice += bitsv[j];
  133.     }
  134.     cout<<"偶数算少了1 x-1 == "<<choice<<"    最高位="<<record_bit+1
  135.     <<" ***偶数进位算法未解决*** "<<endl;
  136. }


  137. void process_single(int*bitsv,int*bsv,int n)
  138. {
  139.     int t=n;
  140.     int i=max_bit;
  141.     while(t>0) // 1~32766 必然是奇数
  142.     {
  143.         if(t>bitsv[i]) //从最高位 开始 找
  144.         {
  145.             t -= bitsv[i]; //1~32766 必然是奇数 减去 当前位的值
  146.                            //进入低1位的检查

  147.             bsv[i]=1;     //设置2进制位
  148.         }

  149.         if(t==1) //到达 最低位 需要结束
  150.         {
  151.             bsv[0]=1;   //2进制 最低位 设为1 因为 1~32766 必然是奇数
  152.             t=0;        //结束处理
  153.         }

  154.         i--; //从15位到1位倒序遍历
  155.     }
  156. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-24 19:47:57 | 显示全部楼层
一般我会这样写
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdint>

  4. using std::cin, std::cout, std::endl;
  5. using std::string;

  6. const string binary(uint32_t value) {
  7.     string result;
  8.     for(uint32_t mask = 0x80000000; mask != 0; mask >>= 1) {
  9.         result.append(value & mask ? "1" : "0");
  10.     }
  11.     return result;
  12. }

  13. int main() {
  14.     cout << binary(100) << endl;
  15.     return 0;
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 19:52:22 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdint>

  4. using std::cin, std::cout, std::endl;
  5. using std::string;

  6. const string binary(uint32_t value) {
  7.     string result;
  8.     for(uint32_t mask = 0x80000000; mask != 0; mask >>= 1) {
  9.         result.append(value & mask ? "1" : "0");
  10.     }
  11.     return result;
  12. }

  13. const string format(const string &s) {
  14.     string result;
  15.     bool flag = false;
  16.     for(size_t i = 0; i < s.size(); ++i) {
  17.         if(flag && i % 2 == 0) result += ' ';
  18.         result += s[i];
  19.         flag = true;
  20.     }
  21.     return result;
  22. }

  23. int main() {
  24.     cout << format(binary(100)) << endl;
  25.     return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:04:59 From FishC Mobile | 显示全部楼层
uint32_t mask = 0x80000000;
mask != 0;
mask >>= 1
这个for,是我孤陋寡闻了。
猜测是定义一个变量,
还能直接赋值地址,
也许是立即数的那种概念的数吧,
变量还能使用操作数,
也许这是一个对象吧?
const string binary(uint32_t value)
这个函数,也是超出了想象,
value类型也是这个32的吗?
32怎能如此牛叉?

size_t i = 0; i < s.size(); ++i
这个t类型的i是什么i
二进制返回字符串。
s提供size方法。
单个字符来
+等
还能赋值空格。。。。
感觉完全需要补课,
你这吗容易,行数少,
但需要的前提估计也不少。

谢谢回复,使我再教育,感谢感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:09:09 From FishC Mobile | 显示全部楼层
result.append(value & mask ? "1" : "0");
这像声明,却是实参。
第一次看到这个string的方法,
而且参数操作符的使用也是第一次看到,
我得一段时间去查资料了,谢谢啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:15:25 From FishC Mobile | 显示全部楼层
string::append
查了,原来是字符串后面能连续追加另一个字符串
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:20:58 From FishC Mobile | 显示全部楼层
str3="print 10 and then 5 more";

str.append(str3.begin()+8,
这里的开始,是不是指字符p,算0个,然后
从r数成1
+8个到
10后面的空字符,正好8?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:25:20 From FishC Mobile | 显示全部楼层
参数1 字符串对象使用迭代器指定开始的位置,
参数2 也是对象使用迭代器指定结束的位置。
这让我想起了vector
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:27:13 From FishC Mobile | 显示全部楼层
明天上机,实验一把append,看来很好玩的样子
只是,明明是处理字符的,怎么联系起来处理了数字呢?
楼上朋友能指点一二吗。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:33:40 From FishC Mobile | 显示全部楼层
result.append(value & mask ? "1" : "0");
这个是不是实际就使用了1个参数
这个参数是字符,追加到结果里面,再返回这个结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:35:19 From FishC Mobile | 显示全部楼层
uint32_t mask = 0x80000000;
mask != 0;
mask >>= 1
这个,有80%的可能性正是我考虑如何解决
2进制进位难题的方法。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:38:04 From FishC Mobile | 显示全部楼层
掩码不为0,这个32类型的“掩码”向右移动1位。。。
这个掩码,做何解呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:40:52 From FishC Mobile | 显示全部楼层
100,作为了32类型的参数,
这里是不是有什么玄学?
100的2进制立即数,作为字符,
拿进去遍历,转换吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-24 23:45:14 From FishC Mobile | 显示全部楼层
看了专业的32类型的使用,我决定,
明天去搞清楚这个类型到底是怎么一回事。
我为我的写法感到内疚。原谅我的技术,我还以为我很有想法,结果做了一个臃肿的半成品。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 17:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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