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)位段若出现在表达式中,将被系统自动转换成整数。
- C语言学习之位操作
- C语言学习之位操作符的使用
- 学习C语言中的位操作
- C语言再学习 -- 位操作
- C语言之位操作符
- C语言 位操作
- C语言位操作
- C语言位操作
- C语言位操作
- C语言位操作
- C语言位操作
- c语言位操作
- C语言位操作
- c语言位操作
- C语言-位操作
- C语言位操作
- C语言位操作
- C语言位操作
- [LeetCode] Merge Two Sorted Lists
- 测试
- Android应用程序资源的编译和打包过程分析
- 递归转换二进制
- DiskGeniux无损分区
- C语言学习之位操作
- 拔掉那颗蛀牙的红警
- 山东省赛A题:Rescue The Princess
- 单链表的基本操作
- HDU1286---找新朋友 HDU(104)
- mp4文件格式解析
- hdu1754 I Hate It
- PHP自学之路---报表及绘图技术
- 解决 gento 终端中文方块