#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;
}