赞
踩
- 左移:从二进制的角度看现象,就是左移几位就在右边添几个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);//字符 以十进制 输出
-
-
-
-
-
-
-
-
-
-
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。