广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言位运算符的具体使用
  • 699
分享到

C语言位运算符的具体使用

2024-04-02 19:04:59 699人浏览 泡泡鱼
摘要

目录布尔位运算符 移位运算符 对于更多紧凑的数据,C 程序可以用独立的位或多个组合在一起的位来存储信息。文件访问许可就是一个常见的应用案例。位运算符允许对一个字节或更大的数据单位中独

对于更多紧凑的数据,C 程序可以用独立的位或多个组合在一起的位来存储信息。文件访问许可就是一个常见的应用案例。位运算符允许对一个字节或更大的数据单位中独立的位做处理:可以清除、设定,或者倒置任何位或多个位。也可以将一个整数的位模式(bit pattern)向右或向左移动。

整数类型的位模式由一队按位置从右到左编号的位组成,位置编号从 0 开始,这是最低有效位(least significant bit)。例如,考虑字符值'*',它的 ASCII 编码为 42,相当于二进制的 101010:
位模式 0 0 1 0 1 0 1 0
位位置 7 6 5 4 3 2 1 0

在本例中,值 101010 被表示成一个 8 位的字节内容,因此前面多两个 0。

布尔位运算符

表 1 中列举的运算符可以对操作数的每个位进行布尔运算。这种二元运算符把两个不同操作数内相同位置的位关联起来。被设定的位(也就是值为 1 的位)被解释为 true,被清除的位(也就是值为 0 的位)被解释为 false。

除布尔运算符 AND、OR 和 NOT 以外,也有位异或运算符(exclusive-OR,XOR)。这些都在表 1 进行了列举。

运算符 意义 示例 对于每个位位置的结果(1=设定,0=清除)
    &     位 AND  x&y  如果 x 和 y 都为 1,则得到 1;如果 x 或 y 任何一个为 0,或都为0,则得到 0
    |     位 OR  x|y  如果 x 或 y 为 1,或都为 1,则得到 1;如果 x 和 y 都为 0,则得到 0
    ^     位 XOR  x^y  如果 x 或 y 的值不同,则得到 1;如果两个值相同,则得到 0
    ~     位 NOT(I的补码)  ~x  如果 x 为 0,则得到 1,如果 x 是 1,则得到 0

表1 布尔位运算符

位运算符的操作数必须是整数类型,并且遵循寻常算术转换(usualarithmetic conversion)。转换后获得的操作数通用类型就是整个计算结果的类型。表 2 展示了这些运算符的效果。

表达式(或声明) 位模式
int a=6; 0···00110
int b=11; 0···01011
a&b 0···00010
a|b 0···01111
a^b 0···01101
~a 1···11001

表2 位运算符的效果

可以将一个整数 a 的特定位清除,做法是将整数 a 和另一个整数进行位 AND 运算,其中,另一个整数在需要清除的位为 0,其他位则为 1,并位 AND 运算,其中,另一个整数在需要清除的位为 0,其他位则为 1,并将 AND 运算的结果赋值给整数 a。

该另一个整数,即位 AND 运算的第二个操作数,被设定为 1 的位置(称为位掩码),这些位置经过位 AND 运算,不会改变第一个操作数对应位置的值。例如,一个整数与一个位掩码 0xFF 进行位 AND 运算后,将保留最低位置的 8 个位,而会清除其他所有位的值:


a &= OxFF;            // 相当于:a = a & OxFF;

在该示例中,复合赋值运算符 &= 也会执行 & 运算。复合赋值运算符与其他二元位运算符具有类似的执行方式,这里不再赘述。

位运算符也可以用来生成位掩码,以供以后的位运算使用。例如,在位模式 0x20 中,只有位5被设定。因此表达式 ~0x20 会生成一个只有位 5 没有被设定的位掩码:


a &= ~0x20;             // 清除a中的位5

位掩码 ~0x20 比 0xFFFFFFDF 更受欢迎,因为它的可移植性更好:结果不会受到机器字大小的影响(同时也更方便人阅读)。

也可以使用运算符 |(OR)和 ^(XOR)来设定或清除特定位,下面是一个示例:


int mask = OxC;
a |= mask;              // 设定a的位2和位3
a ^= mask;              // 求反a的位2和位3

第二个转换使用相同的位掩码,它会将第一次转换的结果再反转一次。换句话说,b^mask^mask 会得到原来 b 的值。这个操作可以用于交换两个整数的值,而不需要使用第三个临时变量:


a ^= b;                  // 等效于 a = a ^ b;
b ^= a;                 // 将a原来的值赋值给b
a ^= b;                 // 将b原来的值赋值给a

本例中的前两个表达式等同于 b=b^(a^b)或 b=(a^b)^b。其结果等同于 b=a,副作用是 a 的值也被修改了,其修改后的值为 a^b。在这时,第三个表达式具有如下副作用 a=(a^b)^a 或 a=b(使用 a 和 b 的原始值)。

移位运算符

移位运算符将左操作数的位模式移动数个位置,至于移动几个位置,由右操作数指定。它们如表 3 列举。

运算符 意义 示例 结果
<< 向左移位 x<<y x 的每个位向左移动 y 个位
>> 向右移位 x>>y x 的每个位向右移动 y 个位

表3 移位运算符

移位运算符的操作数必须是整数。在实际移位操作之前,两个操作数都要进行整数提升(promotion)。右边操作数不可以为负值,并且必须少于左边操作数在整数提升之后的位长。如果不符合这些条件,程序运行结果将无法确定。

移位运算结果的类型等于左操作数在整数提升后的类型。下面示例的移位表达式具有 unsigned long 类型。


unsigned long n = 0xB,     // 位模式: 0 ... 0 0 0 1 0 1 1
         result = 0;
result = n << 2;          //              0 ... 0 1 0 1 1 0 0
result = n >> 2;          //              0 ... 0 0 0 0 0 1 0

在向左移位运算时,右边多出来的位用 0 来填充。移动超出左边边界的位则直接抛弃。向左移动 y 个位置,就等同于将左操作数乘以 2^{y}:如果左操作数 x 是无符号类型,那么表达式 x<<y 的结果等于表达式 x×2^{y} 的值。因此,在前面的例子,n<<2 的值为 n×4,也就是 44。

在向右位移运算时,如果左操作数是无符号类型,或者左操作数是带符号类型但为非负值,则左边多出来的位用 0 来填充。在这种情况下,表达式 x>>y 的结果等效于表达式 x/2^{y} 的值。如果左操作数是负值,那么由编译器决定用于填充至左边多出来的位的内容,可能是 0,也可能是符号位。


// 函数setBit()
// 设定掩码m中p位置的位。
// 使用定义在limits.h中的CHAR_BIT,存储一个字节内的位的数目。
// 返回值: 完成位设定的新掩码,其中p位置已设定好
//              如果p不是有效的位置,则返回原始掩码。
unsigned int setBit( unsigned int mask, unsigned int p )
{
  if ( p >= CHAR_BIT * sizeof(int) )
    return mask;
  else
    return mask | (1<<p);
}

移位运算符的优先级比算术运算符的优先级更低,但相对于比较运算符以及其他的位操作运算符,具有更高的优先级。上例表达式 mask|(1<<p)中的括号必要性不大,主要是让程序代码更容易阅读。

到此这篇关于C语言位运算符的具体使用的文章就介绍到这了,更多相关C语言位运算符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言位运算符的具体使用

本文链接: https://www.lsjlt.com/news/135191.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言位运算符的具体使用
    目录布尔位运算符 移位运算符 对于更多紧凑的数据,C 程序可以用独立的位或多个组合在一起的位来存储信息。文件访问许可就是一个常见的应用案例。位运算符允许对一个字节或更大的数据单位中独...
    99+
    2022-11-12
  • C语言位运算符如何使用
    本篇内容介绍了“C语言位运算符如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、位运算符分析C语言中的位运算符位运算符直接对 bit...
    99+
    2023-06-30
  • c语言中的移位运算符
    移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。 c语言中提供了两种移位运算符: 左移运算符:<< 右移运算符:>&...
    99+
    2022-11-12
  • c语言移位运算符如何用
    C语言中的移位运算符有左移位运算符()。它们可以用于对一个数进行二进制位的移动。左移位运算符(2的操作,结果为2(二进制表示为10)...
    99+
    2023-08-18
    c语言
  • c语言中移位运算符如何使用
    C语言中的移位运算符有两种:左移位运算符()。这两种运算符用于对一个数进行位移操作。左移位运算符(>)和算术右移(>>>)。逻辑右移...
    99+
    2023-09-14
    c语言
  • C语言详细讲解位运算符的使用
    目录一、位运算符分析二、小贴士三、位运算与逻辑运算四、小结一、位运算符分析 C语言中的位运算符 位运算符直接对 bit 位进行操作,其效率最高。 &按位与|按位或^按位异或~...
    99+
    2022-11-13
  • 如何使用C语言运算符
    这篇文章主要介绍“如何使用C语言运算符”,在日常操作中,相信很多人在如何使用C语言运算符问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用C语言运算符”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!&n...
    99+
    2023-06-15
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • C语言算术运算符怎么使用
    本文小编为大家详细介绍“C语言算术运算符怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言算术运算符怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。下表列出了C语言中的算术运算符。运算符操作-减...
    99+
    2023-07-05
  • C语言怎么使用位运算符来判断正负数
    这篇文章主要介绍“C语言怎么使用位运算符来判断正负数”,在日常操作中,相信很多人在C语言怎么使用位运算符来判断正负数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么使用位运算符来判断正负数”的疑惑有所...
    99+
    2023-06-17
  • c语言逗号运算符的使用方法
    本文将为大家详细介绍“c语言逗号运算符的使用方法”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“c语言逗号运算符的使用方法”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获新知识吧...
    99+
    2023-06-06
  • C语言怎么使用按位与运算符判断奇偶数
    这篇文章主要讲解了“C语言怎么使用按位与运算符判断奇偶数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么使用按位与运算符判断奇偶数”吧!使用按位与运算符判断奇偶数:#include&...
    99+
    2023-06-17
  • C语言逻辑运算符如何使用
    今天小编给大家分享一下C语言逻辑运算符如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、&& 与 I...
    99+
    2023-06-30
  • C语言中位运算符"|"的高级用法有哪些
    本篇内容主要讲解“C语言中位运算符"|"的高级用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中位运算符"|"的高级用法有哪些”吧!一、将两...
    99+
    2023-07-06
  • C语言中求余运算符的使用解读
    目录C语言中求余运算符的使用C语言中求余运算符的注意事项总结C语言中求余运算符的使用 C语言的算数运算符中最有特点的是求余运算符%,它可以应用到很多问题的求解中,下面是几个例子。 例...
    99+
    2023-02-24
    C语言余运算符 C语言运算符 余运算符使用
  • C语言中求余运算符如何使用
    这篇文章主要介绍了C语言中求余运算符如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中求余运算符如何使用文章都会有所收获,下面我们一起来看看吧。C语言中求余运算符的使用C语言的算数运算符中最有特点的...
    99+
    2023-07-05
  • C语言三元运算符怎么用
    今天小编给大家分享一下C语言三元运算符怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。三元运算符:#include&nb...
    99+
    2023-06-17
  • C语言运算符的重载详解
    目录运算符重载的规则 1. 运算符重载为成员函数2. 运算符重载为非成员函数        ...
    99+
    2022-11-13
  • C语言的运算符你了解吗
    目录前言一、算数运算符(数学运算) + -* / %二、逻辑运算符(判断真假)|| &&> >= < <=!? : ...
    99+
    2022-11-12
  • C语言中位运算符"|"的5种高级用法总结
    目录前言一、将两个字节合并成一个16位整数二、将一个字节的低4位和高4位交换三、将一个字节中的某些位置1四、将一个字节中的某些位置0五、将低位连续的0变为1小结前言 在上一篇文章中,...
    99+
    2023-05-15
    C语言位运算符I用法 C语言位运算符I C语言位运算符
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作