位操作(Bit Operations) 内存对齐

一.位操作(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():提示编译器取消自定义字节对齐方式


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘华世(Moments)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值