一.对移位操作的基本概述:
1、什么样的数据类型能够直接移位
char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都能够进行移位操作。而double、float、bool、long double则不能够进行移位操作。
?
2、有符号数据类型的移位操作
对于char、short、int、long这些有符号的数据类型:
对负数进行左移:符号位始终为1。其它位左移
对正数进行左移:全部位左移。即 <<,可能会变成负数
对负数进行右移:取绝对值,然后右移,再取相反数
对正数进行右移:全部位右移。即 >>
?
3、无符号数据类型的移位操作
对于unsigned char、unsigned short、unsigned int、unsigned long这些无符号数据类型:
没有特殊要说明的。使用<< 和 >> 操作符就OK了
结束语
8086 中存在逻辑移位、算术移位,而C\C++中的移位似乎既不是逻辑移位,也不是算术移位。
比方-1,我们若对它右移1位,C的结果仍旧是-1,其实不管右移多少位始终是-1,逻辑移位得到的结果(8位表示)应该是-128。所以这点要注意。
二.利用移位操作实现不同数据类型的转换:
注:左移一位相当于*2。右移一位相当于除以2;
以下是实现long int 到unsigned char,及unsigned char 到short int转换的实例,在dev C++以下,已执行通过,请參考:
#include <stdio.h>
#include <malloc.h>
/*************************************************************************
NAME
???uint32Touint8
DESCRIPTION
??? Unpack auint32 into an array of 4 uint8s
*************************************************************************/
void uint32Touint8(unsigned char *dest, unsigned longint src)
{
??? *dest++ =src >> 24;
??? *dest++ =(src >> 16) & 0xFF;
??? *dest++ =(src >> 8) & 0xFF;
??? *dest = src& 0xFF;
}
?
/*************************************************************************
NAME
???uint8Touint16
DESCRIPTION
??? Pack anarray of 2n uint8s into an array of n uint16s
**************************************************************************/
void uint8Touint16(unsigned short int *dest, unsignedchar *src, unsigned short int n)
{
??? while (n--)
??? {
??????? *dest =*src++ << 8;
??????? *dest++|= *src++;
??? }
}
int main()
{
??? unsignedchar *dest1 = (unsigned char*)malloc(1);
??? unsignedlong int src1 = 0x12345678;
??? unsignedchar *src2 = (unsigned char*)malloc(2);
??? unsignedshort int *dest2 = (unsigned short int *)malloc(1) ;
??? *src2 =0x12;
??? *(src2+1) =0x34;
???uint32Touint8(dest1,src1);
???uint8Touint16(dest2,src2,1);
??? if(dest1 !=NULL)
??? {
??? for(int i=0;i<4; i++)
???printf("dest[%x] = 0x%x\n",i,dest1[i]);
???}/*dest[0]=0x12,dest[1]=0x34,dest[2]=0x56,dest[3]=0x78*/
??? if(dest2 !=NULL)
??? {
???printf("dest2 = 0x%x\n",*dest2++);
???}/*dest2=0x1234*/
??? getchar();
??? return 0;
??? }
原文:https://www.cnblogs.com/xfgnongmin/p/10798170.html