字节与位的转换

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

}

你可能感兴趣的:(转换)