当前位置:   article > 正文

C语言—位运算_一个数&0x07ff

一个数&0x07ff

位运算

位运算,就是对一个比特(Bit)位进行操作;

C语言提供了六种位运算符:
在这里插入图片描述
除了取反运算符,其余均为双目运算符;

运算量只能是整型或者字符型数据,不能为实型数据;

按位与运算(&)

作用:

1、按位与运算通常用来对某些位清 0,或者保留某些位;

例如要把 n 的高 16 位清 0 ,保留低 16 位,可以进行n & 0XFFFF运算(0XFFFF 在内存中的存储形式为 0000 0000 – 0000 0000 – 1111 1111 – 1111 1111)。

2、取一个数中的某些位;

3、要想将哪一位保留下来,就与一个数进行&运算,次数在该位取1;

按位或运算(|)

作用:
1、按位或运算可以用来将某些位置 1,或者保留某些位;

按位异或运算(^)

参与^运算两个二进制位不同时,结果为 1,相同时结果为 0(不同为1)

作用:
1、按位异或运算可以用来将某些二进制位反转;
例如要把 n 的高 16 位反转,保留低 16 位,可以进行n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 – 1111 1111 – 0000 0000 – 0000 0000)。

2、与0进行异或保留原值;
3、交换两个值,不用临时变量;

取反运算(~)

取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。

左移运算(<<)

左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0

如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方

算术左移和逻辑左移一样都是右边补0

右移运算(>>)

右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。
如果无符号数,补0;
有符号数可能补1,也可能补0,若最高位为0,则补0,若最高位为1,则可能补0也可能补1,由系统决定,分为两种情况:

1、算数右移
补1,即带着符号位一起右移

2、逻辑右移
补0

如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。

不同长度的数据进行位运算

比如:a为short , b为int
系统会将二者按右端对齐,如果a为正数,则左侧16位补满0;若a为负数,左端应补满1;如果a为无符号整数型,则左端填满0;

位段(位域)

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段位域,如下:

struct bs{
    unsigned m;
    unsigned n: 4;          //占4bit
    unsigned char ch: 6;      //占6bit
}
  • 1
  • 2
  • 3
  • 4
  • 5

C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。

C语言标准规定,只有有限的几种数据类型可以用于位域。在 ANSI C 中,这几种数据类型是 int、signed int 和 unsigned int(int 默认就是 signed int);到了 C99,_Bool 也被支持了。

位段要从另一个存储单元开始,可以用如下形式:

int a:1;
int b:2;
int    0;    //本存储单元不再存放数据
int c:3    //在另一存储单元存放
  • 1
  • 2
  • 3
  • 4

上述 int 0;为一个无名位段,无名位域一般用来作填充或者调整成员位置。因为没有名称,无名位域不能使用。

位域有利于减少存储空间。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/272464
推荐阅读
相关标签
  

闽ICP备14008679号