位运算

位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。

位运算符有:    &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。

其中,按位取反运算符是单目运算符,其余均为双目运算符。

位运算符的优先级从高到低,依次为~、&、^、|,

其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。

(1)按位与运算符(&)

按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。

即同为 1 的位,结果为 1,否则结果为 0。

例如,设3的内部表示为

00000011

5的内部表示为

00000101

则3&5的结果为

00000001

按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x & 0177。二是让某变量保留某几位,其余位置0,如以下代码让x只保留最低6位:x = x & 077。以上用法都先要设计好一个常数,该常数只有需要的位是1,不需要的位是0。用它与指定的位串信息按位与。

(2)按位或运算符(|)

按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1

即只要有1个是1的位,结果为1,否则为0。

例如,023 | 035 结果为037。

按位或运算的典型用法是将一个位串信息的某几位置成1。如将要获得最右4为1,其他位与变量j的其他位相同,可用逻辑或运算017|j。若要把这结果赋给变量j,可写成:

j = 017|j

(3)按位异或运算符(^)

按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

即相应位的值相同的,结果为 0,不相同的结果为 1。

例如,013^035结果为026。

异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。

(4)按位取反运算符(~)

按位取反运算是单目运算,用来求一个位串信息按位的反,即哪些为0的位,结果是1,而哪些为1的位,结果是0。例如, ~7的结果为0xfff8。

取反运算常用来生成与系统实现无关的常数。如要将变量x最低6位置成0,其余位不变,可用代码x = x & ~077实现。以上代码与整数x用2个字节还是用4个字节实现无关。

当两个长度不同的数据进行位运算时(例如long型数据与int型数据),将两个运算分量的右端对齐进行位运算。如果短的数为正数,高位用0补满;如果短的数为负数,高位用1补满。如果短的为无符号整数,则高位总是用0补满。

位运算用来对位串信息进行运算,得到位串信息结果。如以下代码能取下整型变量k的位串信息的最右边为1的信息位:((k-1)^k) & k。

移位运算

移位运算用来将整型或字符型数据作为二进位信息串作整体移动。有两个运算符:

<< (左移) 和 >> (右移)

移位运算是双目运算,有两个运算分量,左分量为移位数据对象,右分量的值为移位位数。移位运算将左运算分量视作由二进位组成的位串信息,对其作向左或向右移位,得到新的位串信息。

移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。

(1)左移运算符(<

左移运算将一个位串信息向左移指定的位,右端空出的位用0补充。例如014<<2,结果为060,即48。

左移时,空出的右端用0补充,左端移出的位的信息就被丢弃。在二进制数运算中,在信息没有因移动而丢失的情况下,每左移1位相当于乘2。如4 << 2,结果为16。

(2)右移运算符(>>)

右移运算将一个位串信息向右移指定的位,右端移出的位的信息被丢弃。例如12>>2,结果为3。与左移相反,对于小整数,每右移1位,相当于除以2。在右移时,需要注意符号位问题。对无符号数据,右移时,左端空出的位用0补充。对于带符号的数据,如果移位前符号位为0(正数),则左端也是用0补充;如果移位前符号位为1(负数),则左端用0或用1补充,取决于计算机系统。对于负数右移,称用0 补充的系统为“逻辑右移”,用1补充的系统为“算术右移”。以下代码能说明读者上机的系统所采用的右移方法:

printf("%d\n\n\n", -2>>4);

若输出结果为-1,是采用算术右移;输出结果为一个大整数,则为逻辑右移。

移位运算与位运算结合能实现许多与位串运算有关的复杂计算。设变量的位自右至左顺序编号,自0位至15位,有关指定位的表达式是不超过15的正整数。以下各代码分别有它们右边注释所示的意义:

~(~0 << n)

(x >> (1 p-n)) & ~(~0 << n)

new |= ((old >> row) & 1) << (15 – k)

s &= ~(1 << j)

for(j = 0; ((1 << j) & s) == 0; j ) ;

===================================================================================================

位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表:

运算符 含义 描述

& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1

^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1

~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0

<< 左移用来将一个数的各二进制位全部左移N位,右补0

>> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

1、“按位与”运算符(&)

按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true 例如:3&5 3的二进制编码是11(2)。(为了区分十进制和其他进制,本文规定,凡是非十进制的数据均在数据后面加上括号,括号中注明其进制,二进制则标记为2)内存储存数据的基本单位是字节(Byte),一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位。二进制系统中,每个0或1就是一个位。将11(2)补足成一个字节,则是00000011(2)。5的二进制编码是101(2),将其补足成一个字节,则是00000101(2)

按位与运算:

00000011(2)

&00000101(2)

00000001(2)

由此可知3&5=1

c语言代码:

#include

main()

{

int a=3;

int b = 5;

printf("%d",a&b);

}

按位与的用途:

(1)清零

若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:

原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。

例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:

00101011(2)

&10010100(2)

00000000(2)

c语言源代码:

#include

main()

{

int a=43;

int b = 148;

printf("%d",a&b);

}

(2)取一个数中某些指定位

若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。

a 00101100 10101100

b 00000000 11111111

c 00000000 10101100

(3)保留指定位:

与一个数进行“按位与”运算,此数在该位取1.

例如:有一数84,即01010100(2),想把其中从左边算起的第3,4,5,7,8位保留下来,运算如下:

01010100(2)

&00111011(2)

00010000(2)

即:a=84,b=59

c=a&b=16

c语言源代码: #include main() { int a=84; int b = 59; printf("%d",a&b); }

linux中异或符号,C的|、||、、、异或、~相关推荐

  1. Linux中的 “~” 和 “/”符号代表含义?

    题目 Linux中的 "~" 和 "/"符号代表含义? 解析 首先对于root用户: "~" 表示的是root用户的目录,可以理解为每个用户 ...

  2. linux显示文件中特殊字符,Linux中的特殊符号与正则表达式

    第1章 linux的特殊符号 1.1 通配符 * {} 1.1.1 含义 方便查找文件 通配符是用来找文件名字的. 1.1.2  * 通过find 命令找以 .sh 结尾的文件,使用*替代文件名字. ...

  3. linux中特殊字符的含义,Linux中的特殊符号以及特殊语法

    辨别||.&&.;.$*等符号在linux中的含义 与或 # 将&&前后的两个命令当做一个表达式,如果表达式出错,那么可以认为该表达式为false ➜ ~ ls / & ...

  4. Linux中的特殊符号怎么打出

    在Linux中反斜杠"\"是转移字符,作用就是转移后面的字符变为单纯的字符串.在用xshell远程连接Linux后,发现点击反斜杠键出现"w"字样,这是只需修改 ...

  5. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠

    写在前面:Shell中的特殊字符有 $ 美元符 \ 反斜杠 ` 反引号 "双引号 < ,>;,*,?,[,] 1.反引号``:命令替换 在输出一句话的时候,如果想中间加入命令输出 ...

  6. linux中的链接符号

    1.每个命令之间用;隔开 说明:各命令的执行给果,不会影响其它命令的执行.换句话说,各个命令都会执行,但不保证每个命令都执行成功. 2.每个命令之间用&&隔开 说明:若前面的命令执行成 ...

  7. linux中的特殊符号 (|) 管道。

    命令1 |  命令2 执行命令1的输出作为命令2的输入 举例: ps -ef | grep tomcat ps与grep分别是两个命令(ps -ef列出进程 ,grep tomcat 在列出的内容中查 ...

  8. Linux中的特殊符号-重定向符号

    重定向符号: 1.">"或"1>"输出重定向:把前面输出的东西输入到后边的文件中,会清除文件原有的内容. [root@Simile /]# echo ...

  9. Linux中errno使用

    当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少 ...

  10. Linux中的简单文本处理

    文本处理命令 tr命令(可以用来删除一段文本信息中的某些文字,或者将其进行转换) 格式: tr [option] - SET1 [SET2] 可选参数: -d: 删除和set1匹配的字符 -s:去除s ...

最新文章

  1. 如何参与一个顶级开源项目
  2. 同时删除两张表的数据_把数据表中对应工作表的数据首先删除,然后导入数据...
  3. HDU Problem - 4289 Control(最大流)
  4. 阿里云OSS-对象存储流程梳理演示
  5. 5月份,我居然发了这么多文章?我果然无聊.
  6. Git 历史记录内容对比
  7. MVC与WebForm最大的区别
  8. iview表格处理后台返回的字符串
  9. hive不在同一台机 hue_【Impala篇】---Hue从初始到安装应用
  10. 计算机毕业设计论文资料查找
  11. 如何将一个服务器加入域控中,Windows Server如何创建域并加入域
  12. 烤仔TVのCCW | 带宽不可能三角(上)
  13. 使用nodebb搭建一个论坛
  14. TortoiseSVN 如何去掉文件夹左下角的绿色对勾的方法
  15. 使用 制作出漂亮的图表
  16. 如何用服务器内存做系统盘,服务器内存扩容怎么做
  17. 想健身该怎么做?要练出肌肉需要多久?
  18. 实现网页视频的快速播放
  19. KubeSphere DevOps流水线部署
  20. 纳米软件之通信设备自动测试系统

热门文章

  1. P02 滴水逆向1月4号公开课
  2. C++ typeid 不同类型打印 name
  3. 什么是IOC,解耦?
  4. TransformGizmo(变换)切换
  5. 瑞萨——离线烧录器使用方法
  6. IDEA git 代码已经commit,但未 push推送,如何撤销提交缓存区代码
  7. 【电商】mysql 建表的一些规则 和注意事项
  8. c语言运算符计算作业题,c语言练习集(含答案)
  9. 搜狐2010校园招聘第一站北邮笔试题(转) 以及 本人做的部分答案
  10. 微服务和分布式的概念和区别