一.位操作(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():提示编译器取消自定义字节对齐方式位操作(Bit Operations) 内存对齐
最新推荐文章于 2025-08-27 23:15:39 发布
2513

被折叠的 条评论
为什么被折叠?



