一.对于uint32_t,uint16_t和uint8_t之间的相互转化,以及uint16_t的高低位互换,bit->int转换等
左移:从二进制的角度看现象,就是左移几位就在右边添几个0。
从逻辑上来讲左移n位就是乘以2的n次方了。
右移:从二进制角度看,则是在左边填0,右边去除移动的位数的位 。
(如遇到时1>>1, 便是0.);
(注意:如果操作数是一个正数,那么左边的空缺位使用0补,
如果操作数是一个负数,那么左边的空缺位使用1补)
从逻辑上来讲右移就是除以2的n次方;
将某位置0 a&=~(1<<x);
将某位置1 a|=(1<<x);
取反某位 a^=(1<<x)
向某地址写入 *(*int ) a=0x12302312;
#include <stdio.h>
#define u8 short int //2字节 8位
#define u16 long int //4字节 16位
#define u32 long long //8字节 32位
int main()
{//1. 从u8 -->>>u16的转化
u8 a[2] = { 0xcd, 0xe2 };
u16 b;
//分析:
b=a[0]; //得到高位
b=b<<8;//向左移8位。结果:0xcd00
b=b|a[1];//或上a[1]=0xe2; 即0xcde2
//打印结果:a[1]=0xe2 a[0]0xcd
// b=0xcde2
// 2. 从u16 -->>>u8的转化
u8 a[2] = { 0 };
u16 b = 0xc32d;
//分析:
a[1] = b >> 8;//b向右移8位,0x3c;
a[0] = b & 0xff;//b与上oxff,得到0x2d
//打印结果:a[1]=0xc3 a[0]= 0x2d
// b=0xc32d
// 3.调换高低位的位置 需要先将u16--->>u8 ,调换后,u8--->16
u8 a[2] = { 0xab, 0xcd };
u16 b;
b= a[0] | a[1] << 8;//a[1]左移8位0xcd00,再或上a[0]0x00ab(为方便理解)这样看;
//结果:
//a[1]=0xcd a[0]=0xab
//b=0xcdab
// 4. 从u32 -->>>u8的转化
int i = 4;
u32 a=0x1234abcd;
u8 b[4];
b[0] = a >> 24;
b[1] = (a >> 16)&0xff;
b[2] =( a >> 8)&0xff;
b[3] = a &0xff ;
while (i--)
{
printf("0x%02x\n", b[i]);
}
//5. 从u8 -->>>u32的转化
int i = 4; //8-->32
u32 a;
u8 b[4] = {0xcf,0xb3,0x43,0xbb};
//此顺序不能改
a = (long long)b[3] << 32;//高位
a = b[0] << 24|b[3];//最低位
a =a|(( b[1]&0x00ff)<<16);//低位
a = a | ((b[2] & 0x0000ff) <<8);//次高位
printf("0x%02x\n", a);
// 6.从u32 -->>>u16的转化
int i = 2;
u32 a = 0x1234abcd;
u16 b[2];
b[0] =( a >>16);
b[1] = a &0xffff;
while (i--)
{
printf("0x%02x\n", b[i]);
}
//7. 从u16 -->>>u32的转化
int i = 2;
u32 a ;
u16 b[2] = {0xa1cb,0x2bea};
a=b[0]<<16;
a = b[1] |( b[0]<<16);
printf("0x%02x\n", a);
getchar();
}
//8.int --->>bit(二进制)的转化
int int2_bit(int a)
{
int i,bit,size=sizeof(a)*8;
for(i=0;i<size;i++)
{
bit=a&(1<<(size-i-1));
if(bit==1)
pirntf("1");
else
printf("0");
if(i%4==3)
printf(" ");
}
}
//9.bit-->int的转化
int power(int x)//x的指数幂
{
int i=1,t=2;
if(x ==0)
t=1;
for(;i<x;i++)
{
t=2*t;
}
return t;
}
int bit_int(char *x)
{ int i=0,n=7,tmp,sum;
for(;i<8;i++,n--)
{
tmp=x[i]*pwer(n);
sum+=tmp;
}
return sum;
}
//记录一个整数的二进制有多少个1
int ch_sum(int x)
{
int tmp,is=0;
for(int i=0;i<sizeof(x)*8;i++)
{
tmp=1<<i;
if(x&tmp)
{
is++;
}
}
return is;
}
//取补码
int8_t otcp( uint8_t a)
{
uint8_t b=~a,t=1<<7;
if(a<0)
{
b|=t;
}
return b;
}
//将u8转成16进制类行改
u8 a[2] = { 0x6, 0xc };
u16 b;
//分析:
b=a[0]; //得到高位
b=b<<8;//向左移8位。结果:0x600
b=b|(a[1]<<4);//左移4 ,得到到0xc60
b=b>>4;//去除0 得到到0xc6
printf("0x%0x ",b);
//剔除空格数据间的空格符
u8 d_k(u8 *databuf)
{ int of=0;
for(int i=0;i<sizeof(datebuf);i++)
{
char c=databuf[i];
if(c==' ')
{
++of;
}
else
{
rxbuf[i-of]=c;
}
}
return rxbuf;
}
//ascii码转16进制
char c_buf='a';
int b='a'-'0' ;
printf("0x%0x",b);//hex 输出
printf("\n%d",b);//十进制 输出
printf("\n%d",c_buf);//字符 以十进制 输出