C语言基础丨运算符之位运算符(六)

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

 

C语言提供了六种位运算符:

& 按位与

| 按位或

^ 按位异或

~ 取反

<< 左移

>> 右移

 

位运算应用口诀

清零取反要用与,某位置一可用或

若要取反和交换,轻轻松松用异或

运算规则

1、&与运算:对应两个二进位均为1时,结果位才为1,否则为0。(有假为假==0)

2、|或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0。(有真为真==1)

3、^ 异或运算:对应的二进位不同时为1,否则为0。(不同为真==1,相同为假==0)

注意:(1)相同整数相^的结果是0

(2)一个数^另一数两次结果不变

(3)整数相^跟顺序无关

4、~ 取反运算:对整数的各二进位进行取反,包括符号位(0变1,1变0,真假互换)

5、<< 左移:把整数的各二进位全部左移n位,高位丢弃(包括符号位),低位补0。

左移n位其实就是乘以2的n次方(但移动后符号位变化除外,符号位改变则正负改变)

6、>> 右移:把整数的各二进位全部右移n位,符号位不变。高位的空缺是正数补0;

是负数高位是补0或是补1 取决于编译系统的规定;右移n位其实就是除以2的n次方

运算符优先级

C语言中位运算符之间,按优先级顺序排列为:~、<<、>>、&、^、|、&=、^=、|=、<<=、>>=。

布尔位运算符

1. 按位与运算"&"

按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

main(){

int a=9,b=5,c;

c=a&b;

printf("a=%d/nb=%d/nc=%d/n",a,b,c);

}

2. 按位或运算“|”

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下: 00001001|00000101

00001101 (十进制为13)可见9|5=13

main(){

int a=9,b=5,c;

c=a|b;

printf("a=%d/nb=%d/nc=%d/n",a,b,c);

}

3. 按位异或运算“^”

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。

例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)

main(){

int a=9;

a=a^15;

printf("a=%d/n",a);

}

4. 求反运算“~”

求反运算符“~”为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。

例如~9的运算为: ~(0000000000001001) ,结果为:1111111111110110

移位运算符

左移、右移运算实现将一个数的各个二进制位向左向右移若干位。

5. 左移运算“<<”

左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。

例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

6. 右移运算“>>”

右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。

main(){

unsigned a,b;

printf("input a number: ");

scanf("%d",&a);

b=a>>5;

b=b&15;

printf("a=%d/tb=%d/n",a,b);

}

请再看一例!

main(){

char a='a',b='b';

int p,c,d;

p=a;

p=(p<<8)|b;

d=p&0xff;

c=(p&0xff00)>>8;

printf("a=%d/nb=%d/nc=%d/nd=%d/n",a,b,c,d);

}

当进行按位与或时,最好使用16进制,在程序中这样表示:0x01 表示0000 0001

所以,字符类型a的最高位强制1可以这样:a=a|0x80。其他的可以依次类推!

今天就分享到这里啦,希望对大家学习有所帮助!

文章来源:https://blog.csdn.net/cxyol/article/details/631591

 
(0)

相关推荐

  • 【面试常考】位运算介绍与经典例题总结

    原创公众号:bigsai 原创不易,如果有收获请不要吝啬你的赞赞! 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 位运算隐藏在编程语言的角落中,其神秘而又强大,暗藏内力,有些 ...

  • Python 位操作符(Bitwise)

    什么是Python中的按位运算符? 按位运算符用于对二进制模式(1和0)执行操作.当您在屏幕上执行2 + 3的整数运算时,计算机将以二进制形式读取它-2表示为10,而3表示为11以二进制格式.因此,您 ...

  • 你真的搞懂了Java中的<<、>>、>>>运算符嘛?

    在搞懂<<.>>.>>>之前,我们需要先了解二进制中的源码.反码.补码... 二进制中的原码.反码.补码 有符号数: 对于有符号数而言,符号的正.负机器是无法 ...

  • 说说Python中的6种位运算符?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • C语言基础丨运算符之条件运算符(七)

    条件运算符(conditional operator)有时候也称为三元运算符(ternary operator,或者trinary operator),因为它是唯一需要 3 个操作数的运算符,条件表达 ...

  • C语言基础丨(六)程序结构——分支(选择)结构【2】

    顺序结构的程序虽然能解决计算.输出等问题,但不能做判断再选择.对于要先做判断再选择的问题就要使用分支结构. 分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序.分支结构的程序 ...

  • C语言丨初识位运算符,看这篇文章就够了!

    C语言中位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果.下面小编就为大家介绍下C语言位运算符的用法.   位运算符 C语言 ...

  • C语言丨搞定关系运算符,只需一分钟!

    之前介绍了C语言中的逻辑运算符,今天就分享一下关系运算符吧,希望对大家有所帮助.   关系运算符 在判断条件中,让程序决定下一步的操作,称为关系运算符(Relational Operators). 关 ...

  • JAVA_基础逻辑运算符与位运算符使用

    逻辑运算符 &-----逻辑与| ----- 逻辑或! ----- 逻辑非 &&-----短路与|| ----- 断路或^ ----- 逻辑异或 a b a & b a ...

  • C/C++编程知识:运算符(五)丨sizeof()运算符来啦!

    在C或C ++中, Sizeof是一个非常常用的运算符.它是一个编译时一元运算符,可用于计算其操作数的大小.sizeof的结果是无符号整数类型,通常用size_t表示.sizeof可以应用于任何数据类 ...

  • 文诚教育成功案例丨里昂二大语言中心录取一枚~打下良好的语言基础,进入专业课才不会吃力!

    成功案例又来啦!!! 今天分享最近刚刚收到的语言中心录取~ 想要用最棒的语言状态,更好的衔接法国的大学专业课学习,那么法国的语言中心一定是中国学生的最佳选择,你一定不会后悔这一年的学习的! 晒录取 首 ...

  • C++基础知识篇:C++ 运算符

    运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运 ...