字节与位的转换

#include <iostream>

#include <fstream>

using namespace std;

 

double power(double a,int b)  //a的幂次方

{

       if (b<0)

       {

              cout << "您好,power函数目前还没有求负幂数的次方功能!";

              exit(0);

       }

       double result=1;

       int i=0;

       if (a==0||a==1)

       {

              if (b==0&&a==0)

              {

                     cout << "输入错误!" << endl;

                     exit(0);

              }

              result=a;

       }else{

              for (i=0;i<b;i++)

              {

                     result*=a;

              }

       }

      

       return result;

}

int Bitwise(int position,char value)   //位运算,求出position位置(0为起始点)的十进制值--此处只针对编码来用

{

       int Logical_location=position%8;

       if (value=='1')

       {

              return 1*power(2,7-Logical_location);

       }else if (value=='0')

       {

              return 0;

       }else{

              cout << "编码出错,出现非二进制数!!" << endl;

              exit(0);

       }

       return -1;  //此处应该返回什么值??

}

 

char intToDochar(int x)

{

       if (x==1)

       {

              return '1';

       }else if(x==0)

       {

              return '0';

       }else{

              cout << "出现错误!!" << endl;

              exit(0);

       }

       return '/0';

}

 

void Decimal_to_Binary(int Decimal,char *&p)  //指针p是定位存储二进制编码值的初始位置,存完一个二进制位时,在指向下一个要存位置

{                                                                                  //p为指向数组的当前位置

       int i=0;    //统计存储了多少的位

       int D;  //临时存一个二进制位的值

       int temp=Decimal;

      

       if (Decimal>=0&&Decimal<256)  //1<Decimal<256则将有效地位数存入

       {

              while (temp>=2)   //2求余法

              {

                     D=temp%2;

                     *p=intToDochar(D);

 

                     p--;

                     i++;

                     temp=temp/2;

              }

              if (temp==0||temp==1)  //存入最后一位有效二进制

              {

                     *p=intToDochar(temp);

 

                     i++;

                     if (i==8)      //判断有8个有效的二进制位,并将p移到下一个字节尾

                     {

                            p=p+15;  //向下移,存储下一个字节的二进制位的末尾位置(由于p--到头要到下一个字节的尾部,所以+15)

                            i=100;            //避免走到下面的while循环            

                     }else{p--;}       //若不是则向后移

                    

                     while(i<=8)    //剩余补0

                     {

                            if (i==8)  //判断满8位就转到下一字节

                            {

                                   p=p+15;  //向下移,存储下一个字节的二进制位的末尾位置

                                   i++;

                            }else if (i==7)

                            {

                                   *p=intToDochar(0);

 

                                   i++;

                            }

                            else{              //0

                                   *p=intToDochar(0);

 

                                   i++;

                                   p--;

                            }

                           

                     }

                     }else{}

       }else{       

              cout << "超出ascll码值!";

       }

}

 

 

int main()

{

       int iByte=0;

       int i=0;

       char *q=new char [2048];  //256字节*8=2048

       char *p=q+7;    //起始位置

       for (i=255;i>=0;i--)

       {

              Decimal_to_Binary(i,p);  //十进制转换为二进制

       }

       for (i=0;i<2048;i++)

       {

 

             cout << q[i];

              if ((i+1)%8==0)

              {

                     cout << " ";

              }

 

       }

cout << endl;

       for (i=0;i<2048;i++)

       {

              iByte+=Bitwise(i,q[i]);    //位运算--将第i个位置的二进制位计算出来在赋给iByte

              if ((i+1)%8==0)                          //每满8个计算出一个十进制

              {

                     cout << iByte << " ";

                     iByte=0;

              }

             

       }

       delete [] q;

 

                                   return 0;

}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值