howzyao 发表于 2022-9-24 16:52:38

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

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




#include <iostream>
#include <math.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
const int max_bit = 15;
void input_num(int);
void process_single(int*,int*,int);
void process_double(int*,int*,int);

int main()
{
    cout << "Hello world!" << endl;
    int x=0;

    while(1)
    {
      cout<<"-----------------------------------begin"<<endl;
    cout << "( x<=32767 ) 输入正数 x:   ";
    cin>>x;
    input_num(x);//max 32767

    }

    return 0;
}

void input_num(int x)
{
    int bits_value[ max_bit ];
    int num_bit_save;
    for(int i=0;i<max_bit;i++)
    {
      num_bit_save=0;
      bits_value = pow(2,i);
    }
    int max_num=0;
    for(int i=0;i<max_bit;i++)
    {
      max_num += bits_value;
    }

    int tempx=0;

    if(x<max_num+1)
    {
      tempx=x;
      cout<<"输入的是: "<<tempx <<" (最大数: 32767)"<<endl;
    }
    else
    {
      cout<<"输入的是: "<<x<<" (最大数: 32767) 超过取值上限"<<endl;
    }

    int sum=0;
    for(int i=0;i<max_bit;i++)
    {
      if(tempx==0)
      {
            break;
      }
      else if(tempx==bits_value)
      {
            tempx -= bits_value[ max_bit ];
            num_bit_save=1;
            break;
      }
      else if(tempx >0 && tempx <bits_value)// 处理1~32766
      {
            if(tempx%2==0)
            {
                for(int j=0;j<max_bit; j++)
                {
                  process_double(bits_value,num_bit_save,tempx);
                  break; //跳出所有if 偶数 总是少1 未解决
                }
            }
            else if(tempx%2==1)
            {
                for(int j=0;j<max_bit; j++)
                {
                  process_single(bits_value,num_bit_save,tempx);
                  break; //跳出所有if 奇数 done by 20220924
                }
            }
      }
      break;//跳出for

    }

    int save=0;
    cout<<"2进制数 == ";
    for(int i=max_bit;i>-1;i--)
    {
      num_bit_save=0;
      cout<<num_bit_save;
      if(i%2==0)
            cout<<" ";

    }
    cout<<"\n-----------------------------------end\n\n"<<endl;

    delete bits_value,num_bit_save;
}
void process_double(int*bitsv,int*bsv,int n)
{
    int t=n;
    int i=max_bit;

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


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


      if(t>bitsv)
      {

            t -= bitsv; //2~32766 必然是偶数

            bsv=1;

      }


      if( t<2 )
      {
            //bsv=0;   //2进制 第0位 设为0 因为 2~32766 必然是偶数
            //bsv=0;
            t=-1;      //结束处理
      }

      if( t==2 )
      {
            //t=-1;
            //bsv=0;
            //bsv=1;
            //最高位进位怎么办
            //最高位记录是record_bit
      }

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

    //总是少一个
    int choice=0;
    for(int j=0;j<max_bit;j++)
    {
      if(bsv==1)
      choice += bitsv;
    }
    cout<<"偶数算少了1 x-1 == "<<choice<<"    最高位="<<record_bit+1
    <<" ***偶数进位算法未解决*** "<<endl;
}


void process_single(int*bitsv,int*bsv,int n)
{
    int t=n;
    int i=max_bit;
    while(t>0) // 1~32766 必然是奇数
    {
      if(t>bitsv) //从最高位 开始 找
      {
            t -= bitsv; //1~32766 必然是奇数 减去 当前位的值
                           //进入低1位的检查

            bsv=1;   //设置2进制位
      }

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

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

人造人 发表于 2022-9-24 19:47:57

一般我会这样写
#include <iostream>
#include <string>
#include <cstdint>

using std::cin, std::cout, std::endl;
using std::string;

const string binary(uint32_t value) {
    string result;
    for(uint32_t mask = 0x80000000; mask != 0; mask >>= 1) {
      result.append(value & mask ? "1" : "0");
    }
    return result;
}

int main() {
    cout << binary(100) << endl;
    return 0;
}

人造人 发表于 2022-9-24 19:52:22

#include <iostream>
#include <string>
#include <cstdint>

using std::cin, std::cout, std::endl;
using std::string;

const string binary(uint32_t value) {
    string result;
    for(uint32_t mask = 0x80000000; mask != 0; mask >>= 1) {
      result.append(value & mask ? "1" : "0");
    }
    return result;
}

const string format(const string &s) {
    string result;
    bool flag = false;
    for(size_t i = 0; i < s.size(); ++i) {
      if(flag && i % 2 == 0) result += ' ';
      result += s;
      flag = true;
    }
    return result;
}

int main() {
    cout << format(binary(100)) << endl;
    return 0;
}

howzyao 发表于 2022-9-24 23:04:59

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方法。
单个字符来
+等
还能赋值空格。。。。
感觉完全需要补课,
你这吗容易,行数少,
但需要的前提估计也不少。

谢谢回复,使我再教育,感谢感谢。

howzyao 发表于 2022-9-24 23:09:09

result.append(value & mask ? "1" : "0");
这像声明,却是实参。
第一次看到这个string的方法,
而且参数操作符的使用也是第一次看到,
我得一段时间去查资料了,谢谢啊

howzyao 发表于 2022-9-24 23:15:25

string::append
查了,原来是字符串后面能连续追加另一个字符串

howzyao 发表于 2022-9-24 23:20:58

str3="print 10 and then 5 more";

str.append(str3.begin()+8,
这里的开始,是不是指字符p,算0个,然后
从r数成1
+8个到
10后面的空字符,正好8?

howzyao 发表于 2022-9-24 23:25:20

参数1 字符串对象使用迭代器指定开始的位置,
参数2 也是对象使用迭代器指定结束的位置。
这让我想起了vector

howzyao 发表于 2022-9-24 23:27:13

明天上机,实验一把append,看来很好玩的样子
只是,明明是处理字符的,怎么联系起来处理了数字呢?
楼上朋友能指点一二吗。

howzyao 发表于 2022-9-24 23:33:40

result.append(value & mask ? "1" : "0");
这个是不是实际就使用了1个参数
这个参数是字符,追加到结果里面,再返回这个结果

howzyao 发表于 2022-9-24 23:35:19

uint32_t mask = 0x80000000;
mask != 0;
mask >>= 1
这个,有80%的可能性正是我考虑如何解决
2进制进位难题的方法。。。

howzyao 发表于 2022-9-24 23:38:04

掩码不为0,这个32类型的“掩码”向右移动1位。。。
这个掩码,做何解呢?

howzyao 发表于 2022-9-24 23:40:52

100,作为了32类型的参数,
这里是不是有什么玄学?
100的2进制立即数,作为字符,
拿进去遍历,转换吗?

howzyao 发表于 2022-9-24 23:45:14

看了专业的32类型的使用,我决定,
明天去搞清楚这个类型到底是怎么一回事。
我为我的写法感到内疚。原谅我的技术,我还以为我很有想法,结果做了一个臃肿的半成品。
页: [1]
查看完整版本: 大家有好的二进制算法吗?这个是想当然的做法,不理想.都来看看吧,欢迎指导