一、按位与 &

1.概念:参加运算的两个对象,按二进制位进行“与”运算,负数按补码形式参加按位与运算。

2.规则

0&0=0; 0&1=0; 1&0=0; 1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

例如:4&30 即 0000 0100 & 0001 1110 = 0000 0100 因此,4&30的值得4

3.注意事项和用途

注意:负数按补码形式参加按位与运算

用途:

清零:如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

取一个数中指定位:

找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,

取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;

还可用来取X的2、4、6位。

二、按位或 |

1.概念:参加运算的两个对象按二进制位进行“或”运算,负数按补码形式参加按位与运算。

2.规则

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

例如:4|30 即 0000 0100 | 0001 1110 = 0000 0100 因此,4|30的值得30

3.用途

常用来对一个数据的某些位置1:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。

例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。

三、按位异或运算^

1.概念:参加运算的两个数据,按二进制位进行“异或”运算

2.规则

运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

例如:4^30 即 0000 0100 ^ 0001 1110 = 0001 1010 因此,4^30的值得26

3.用途

使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。

例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。

与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。

四、取反运算符~

1.概念:参加运算的一个数据,按二进制位进行“取反”运算。

2.规则

运算规则:~1=0; ~0=1;

即:对一个二进制数按位取反,即将0变1,1变0。

使一个数的最低位为零,可以表示为:a&~1。

五、左移运算符<<

1.概念:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

2.规则

int i = 1;

i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000

i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位

i = i << 33; // 33 % 32 = 1 左移1位,i变成2

j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

3.计算方法

2<<1 的值是:2*(2^1) = 4

2<<3 的值是:2*(2^3) = 16

左移相当于*2,只是要注意边界问题。如char a = 65; a<<1 按照*2来算为130;但有符号char的取值范围-128~127,已经越界,多超出了3个数值,所以从-128算起的第三个数值-126才是a<<1的正确结果

六、右移运算符>>

1.概念:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

2.规则

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;

i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

负数10100110 >>5(假设字长为8位),则得到的是 11111101

3.计算方法

-14 (即二进制的 11110010)右移两位等于 -4 (即二进制的 11111100)。

右移相当于除以2,只是要注意移位比较多的时候结果会趋近去一个非常小的数

七、无符号右移运算符>>>

1.概念:把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。

2.规则

例如:vartemp = -14 >>> 2

变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。

八、复合赋值运算符

位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

&= 例:a &= b 相当于a=a & b

|= 例:a |= b 相当于a=a | b

>>= 例:a >>= b 相当于a=a >> b

<<= 例:a <<= b 相当于a=a << b

^= 例:a ^= b 相当于a=a ^ b

运算规则:和前面讲的复合赋值运算符的运算规则相似。

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

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

如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

以“与”运算为例说明如下:我们知道在C语言中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足,

(1)如果整型数据为正数,左边补16个0。

(2)如果整型数据为负数,左边补16个1。

(3)如果整形数据为无符号数,左边也补16个0。

如:long a=123;int b=1;计算a & b。

如:long a=123;int b=-1;计算a & b。

如:long a=123;unsigned int b=1;计算a & b。

c语言中按位或与按位异或的区别,C:按位与、按位或、按位异或运算相关推荐

  1. C语言中()和【】的区别?

    C语言中()和[]的区别? 1.注意()是初始化,[]是定义多个对象. 2.int* p = new int (100) 是创建一个int型的内存,并赋值为100; int *p = new int[ ...

  2. c语言中换行符与回车符的区别,C语言中换行符与回车符的区别

    本文章详细介绍了回车与换行符的由来和区别.讲解,通俗易懂,可以使自己深入理解它们 C语言中换行符与回车符的区别 能不能说"换行符就是输入完一行内容后,光标转到下一行的起始位置",而 ...

  3. c语言中不用换行读符而直接换行,C语言中换行符与回车符的区别

    1.C 语言中换行符与回车符的区别能不能说"换行符就是输入完一行内容后,光标转到下一行的起始位置",而"回车符就是输入完一行后光标转到该行的起始位置,其并不换行" ...

  4. c语言标量变量是什么,C语言中的结构和联合之间的区别

    C中的结构 结构是C语言中可用的用户定义数据类型, 它允许组合不同种类的数据项.结构用于表示记录. 定义结构: 要定义结构, 你必须使用struct声明. struct语句定义一种新的数据类型, 该数 ...

  5. C语言中如何把位赋值给字节,优秀程序员必须知道的20个位运算技巧

    一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读&l ...

  6. C语言中变量的作用域和生存期的区别

    变量的作用域与生存期 一.变量的作用域 1.基本概念 2.代码分析 3.总结 二.变量的生存期 1.基本概念 2.C语言的内存分布 (1)基本概念 (2)数据在内存中的分布 3.总结 4.补充 一.变 ...

  7. Hive 中类SQL语言中的 oder by,gruop by的区别

    order by 是按字段排序 group by 是按字段分组,即select 字段必须是"分组依据字段" order by 从英文翻译出发,就是行的排序方式,默认的为升序. or ...

  8. C语言中取余与取模的区别

    c中取余与取模区别 以前没注意过这个问题,今天查了一下,感觉过于繁琐,现在简单明了的总结一下 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者 ...

  9. c语言中 #include < > 和include “ “的区别

    一.引用的头文件不同 #include< >引用的是编译器的类库路径里面的头文件. #include" "引用的是你程序目录的相对路径中的头文件. 二.用法不同 #in ...

  10. c语言中14 3,C语言中的单精度和双精度浮点型的区别!3.14是哪种?3.14159呢?

    3.14是单精度,3.14159是双精度. 两者区别如下: 一.指代不同 1.单精度:是指计算机表达实数近似值的一种方式. 2.双精度:此数据类型与单精度数据类型(float)相似,但精确度比floa ...

最新文章

  1. 最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...
  2. pythonturtle是标准库_Python中turtle库的使用
  3. onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...
  4. Linux+Docker+腾讯云/阿里云服务器 安装MySQL相关命令整理
  5. Shared library can't open object
  6. html斜删除线怎么设置,html如何设置加粗、倾斜、下划线、删除线等字体效果
  7. 关于学习 unity3D 的知识预储备
  8. linux把终端嵌入桌面,在你的Ubuntu Linux桌面上嵌入终端窗口
  9. 高级火山图 突出显示自定义的基因volcanic volcano plot duqiang 差异基因火山图
  10. 贴吧签到php,贴吧自动签到 – 前端开发,JQUERY特效,全栈开发,vue开发
  11. Clonezilla SE---克隆linux------转载
  12. 一张图快速了解23种设计模式
  13. 图像算法工程师 笔试题集锦
  14. SSH2.0编程 ssh协议过程实现(转)
  15. CSS开发中所有基本属性的使用技巧
  16. web淘宝电商页面搭建
  17. 光敏电阻5506主要参数_常用光敏电阻的规格参数
  18. SAP中内部订单状态导致不能收货处理实例
  19. 产品设计和交互设计总结
  20. 全志F1C芯片参数对比,供查阅

热门文章

  1. php重定向返回200,PHP重定向回上一页
  2. 神奇的伽玛函数(下)
  3. JS数组中的方法 flat(),flatMap()
  4. HAVING用法详解
  5. 从VMWare到Openstack到FDIO
  6. Android编译流程
  7. 【分布式搜索引擎02】
  8. 小米AI实验室六篇论文获 ICASSP 2022收录,多模态语音唤醒挑战赛夺冠
  9. 【NOIP2018模拟赛2018.10.20】蒲公英的约定
  10. Python面向对象魔法、元类简介及使用