C语言学习之位操作

来源:互联网 发布:加密内容以便保护数据 编辑:程序博客网 时间:2024/05/22 11:59

C语言之位操作

~取反操作将每个1变为0,每个0变为1,;

&位与操作对两个操作数逐位进行比较,产生一个新值,只有两个操作数对应的位都为1时该位结果才为1;

|位与操作对两个操作数逐位进行比较,产生一个新值,只要两个操作数对应的位有一个为1时该位结果就为1;

^位异或操作对两个操作数逐位进行比较,产生一个新值,只有两个操作数对应为相异时该位结果才为1;

位操作用法:

1.掩码 位与运算符通常与掩码一起使用,掩码通常打开某些位(设为1),将得到的结果与掩码进行位与运算,判断这些打开的位的值;

2.打开位/关闭位  位或通常用来打开/关闭某些位  打开 flag |=MASK; 关闭 flag &=~MASK;

3.转置位 异或操作通常用来转置某些位;

4.查看位 MASK(只有一位打开)可以这样做判断 if((flag&MASK)== MASK)

移位操作:

左移<<   右移>> 使用移位操作可以高效的实现乘或者除2的整数次幂,同时利用右移可以从较大位数的数据里面提取较小位数的数据,左移可以将几个较小位数的数据合并成较大位数的数据。


位字段:

定义:位字段简称字段,是“字”中相邻位的集合;所谓“字”是由实现定义的单一存储单元。字段定义和访问的语法基于结构。

位字段所允许的类型:C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号字段,带符号字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号。C99允许_Bool类型的位字段。

应用:位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。

定义格式:unsigned <成员名>:<二进制位数>

例如:
struct bytedata
{
unsigned a:2; /*位段a,占2位*/
unsigned:6; /*无名位段,占6位,但不能访问*/
unsigned:0; /*无名位段,占0位,表下一位段从下一字边界开始*/
unsigned b:10; /*位段b,占10位*/
int i; /*成员i,从下一字边界开始*/
} data;
位段数据的引用:
同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数定的范围,否则超出部分会丢弃。
例如:data.a=2; 但 data.a=10;就超出范围(a占2位,最大3)

 注意:
(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。
(2)可以通过定义长度为0的位段的方式使下一位段从下一存储单元开始。
(3)可以定义无名位段。
(4)位段的长度不能大于存储单元的长度。
(5)位段无地址,不能对位段进行取地址运算。
(6)位段可以以%d,%o,%x格式输出。
(7)位段若出现在表达式中,将被系统自动转换成整数。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 雅思作文字数不够怎么办 英国选修课挂科怎么办 英国双申保证金怎么办 研究生挂科了怎么办 大一绩点没过2.0怎么办 美国留学生打工超时怎么办 ucl挂科了怎么办 硕士不会发论文怎么办 中兴今年招聘硕士生怎么办 rmit 语言班不过怎么办 非深圳户口怎么办护照 学位网学历认证怎么办 中国高中gpa低怎么办 函数毕业证丢了怎么办 加拿大大签过期怎么办 学位证封皮丢了怎么办 澳洲留学签证拒签怎么办 法国留学托业没过怎么办 高二成绩下降怎么办 预科成绩挂了怎么办 香港gpa不够2.5怎么办 phd转mphil签证怎么办 申请essay抄袭后怎么办 商标注册证丢了怎么办 身份证过期怎么办澳洲签证 招商银行卡被冻结怎么办 正本提单丢了怎么办 英国留学gpa不够怎么办 英国留学回国就业怎么办 高中会考考b怎么办 加拿大签证被拒怎么办 在rmit挂科怎么办 英国brp丢了怎么办 澳洲留学生怎么办日本签证 小孩出生证掉了怎么办 去澳洲旅游怎么办签证 小孩澳洲签证慢怎么办 澳洲签证小孩怎么办网签啊 去澳大利亚工作怎么办签证 国内怎么办澳洲过境签 被淘宝直播屏蔽怎么办