首页 > 其他 > 详细

23. 位运算,位字段

时间:2020-05-01 12:45:44      阅读:81      评论:0      收藏:0      [点我收藏+]

假设A代表一个二进制位,则有如下恒等式:

A & 0 = 0

A & 1 = A

A | 0 = A

A | 1 = 1

A ^ 0 = A

A ^ 1 = ~A

A ^ A = 0

A & ~A = 0

A | ~A = 1

 

如果

A ^ B = C

A ^ C = B

B ^ C = A

 

右移一个符号数时,高位填符号位

右移一个符号数时,高位填0

 

只用位运算求绝对值:

int myabs(int n) {
	int sign = n >> 31;//负数得到0xffffffff,正数得到0x00000000
	int res = (n ^ sign) - sign;//位运算优先级较低,记得加括号
	return res;
}

  

位字段:

struct Access {
	//WRES
	unsigned Share :	 1;		//第0位
	unsigned Execute :     1;		//第1位
	unsigned Read :	 1;		//第2位
	unsigned Write :	 1;		//第3位
};
struct Access {
	//WRES
	//WW WWWW RRRR REEE ESSS
	unsigned Share :	     3;		//第0~2位
	unsigned Execute :	4;		//第3~6位
	unsigned Read :		5;		//第7~11位
	unsigned Write :	     6;		//第12~17位
};

Access acc = { 0 };
acc .Share = 0b111011;		//只最后3位011赋值
acc .Execute = 0b111011011;//只最后4位1011赋值
acc .Read = 0b11110101011;	//只最后5位01011赋值
acc .Write = 0b1110101011011;//只最后6位011011赋值


struct Access {
	//WRES
	//WWWW WWRR RRR? ?EEE ESSS
	unsigned Share :	  3;		//第0~2位
	unsigned Execute :  4;		//第3~6位
	unsigned         :  2;		//第7~8位,无名位字段,作者保留
	unsigned Read :	  5;		//第9~13位
	unsigned Write :	  6;		//第14~19位
};

struct Access {
	//WRES
	//WW WWWW RRRR REEE ESSS
	unsigned Share :	     3;		//第0~2位
	unsigned Execute :	4;		//第3~6位
	unsigned Read :		5;		//第7~11位
	unsigned Write :	     6;		//第12~17位
};

Access acc = { 0 };
acc .Share = 0b111011;		//只最后3位011赋值
acc .Execute = 0b111011011;//只最后4位1011赋值
acc .Read = 0b11110101011;	//只最后5位01011赋值
acc .Write = 0b1110101011011;//只最后6位011011赋值


struct Access {
	//WRES
	//WWWW WWRR RRR? ?EEE ESSS
	unsigned Share :	  3;		//第0~2位
	unsigned Execute :  4;		//第3~6位
	unsigned         :  2;		//第7~8位,无名位字段,作者保留
	unsigned Read :	  5;		//第9~13位
	unsigned Write :	  6;		//第14~19位
};    

  

23. 位运算,位字段

原文:https://www.cnblogs.com/Nutshelln/p/12812813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!