位操作(Bit Operations) 内存对齐

来源:互联网 发布:天池大数据算法 编辑:程序博客网 时间:2024/05/16 08:47

一.位操作(Bit Operations)    位操作是整数特有的操作,它有<<,>>,&,|,^,~六个操作。    1.左移操作:    左移操作将整数最高位挤掉,而在右端补0。    2.右移操作:    右移操作是在整数的高位挤一个0或1进去,而整数右边的1或0被挤掉。    C++对右移操作有一个规定:对有符号数,若最高位是1,则高位挤进1;    最高位是0则挤进0。而对无符号数,则一律高位挤进0。    这个规定是为了使整数移位操作保持符号的一致性。二.位操作例子:/*使用运算符实现一个十六进制表示的正整数值的高低位交换。例如,一个正整数值为xABCD,高低位交换后的数值是xDCBA。*///http://www.pythonschool.com/#include <stdio.h> //标准输入输出头文件int HTL(int n); //位交换函数声明int main(){    int a = 0x12345678;//测试值    a = HTL(a); //调用交换函数printf("%x\n", a); //输出交换后的值#line 100 "change line and filename"    printf("%d\n", __LINE__);printf("%s\n", __FILE__);/*#line num[“filename”] 可以用于改变当前所在的行号和文件名称 []里的可以省略*/    getchar();//暂停屏幕输入回车退出    return 0;}int HTL(int n) //位交换函数定义{    int k=sizeof(n); //32位系统只能位    int r=0; //交换后的返回值    int t=0; //存储要交换位    int f=0; //记录有效位是多少    int i;         for(i=2*k-1;i>=0;i--)    {        t=n>>i*4;        t&=0xf;        if(t==0 && f==0)continue; //t==0代表要交换位为零,f==0如果是在左端为零忽略不转        if(f==0)f=i; //当t!=0时,记录要转换数据的最大位        t<<=(f-i)*4; //反转        r|=t; //合并    }    return r;}三.内存对齐C++编译器为了使CPU的性能达到最佳,会对struct的内存结构进行优化。默认的情况下,编译器会对struct的结构进行数据对齐,以提高读取效率。对齐有自然对齐和指定对齐。(1)自然对齐。编译器按照结构体成员中长度最大的成员进行对齐,为结构体的每个成员分配空间。(2)指定对齐改变默认对齐条件,按照指定的对齐条件对结构体成员进行对齐。伪指令#pragma pack(n):指示编译器按照n字节对齐。如果n大于结构体最大成员的长度,则编译器仍按照结构体中最大成员的长度进行对齐。伪指令#pragma pack():提示编译器取消自定义字节对齐方式


原创粉丝点击