位运算
Posted 梦里梦见梦不见的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。
1.位与运算 &
注意:& 和 && 是有区别的。前面这个是位与运算,后者是逻辑与运算,也就是算数运算
1 1 1 1
0 1 0 1
看看位与运算的真值表 结论:全真为真。其他为假
0 & 1 0
1 & 0 0
1 & 1 1
0 & 0 0
0x5b 5 0101
例如:
0xb5 & 0123 0x11
001101110
010101111
00000101110 02e
0x2c & 0x2b 0x28
1100
1010 1000
2.位或运算
真值表
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1
位或运算 (|)和逻辑或(||)区别
区别和上面的与类似 有1就为1
027 | 0x74
00010111
01110101
0111 0111 0x77
0x1f | 0xa5 0xbf
0x5f | 0x50 0x5f
3、位异或 (^)
真值表;
1 ^ 0 1
1 ^ 1 0
0 ^ 0 0
0 ^ 1 1
从真值表能得出结论:相同的就为0,不同的为1
异或就是相当于把两个相异的进行或操作
25 ^ 0263
0x5f ^ 0xa4 0xfb
01011111
10100100 1111 1011 0xfb
0x47 & 0x38 0xa5 | 0x4f 0x14 ^ 0124
0x0 0xef 0x40 0x004 0xa8
000010100
001010100
0100 0000
4、位取反 ~
注意:在C语言中位取反是~,逻辑取反!
规则:把二进制数进行一个变化。1变成0,0变成1
总结:任何非0的数被逻辑取反在取反就会得到1;
任何非0数被位取反在取反就会得到本身;
~0x5f ~0124 ~47
0xa0 065 0x2b
总结:
5.左移动 << 右移动 >>
在c语言中,进行位左移操作的时候要取决于数据类型
对于无符号数,左移时右侧补0
对于无符号数,右移动左侧补0;
对于有符号数, 左移动时右侧补0
对于有符号数,右移时左侧补符号位(如果是正数九补0,负数补1);
在嵌入式中。在研究位移动,为了方便、快捷。我们规定移位都是无符号的数。
6.左移 <<
s数<< 多少位
0x54 <<2
01010100 01010000 0x50
0xf4 <<1 0x6b<<6
0xe8 0xc0
7.右移
数>> 多少位
0x54 >>2
01010100
0xf4 >>4 0xd1 >>1
0x0f 0x68
升级:
0x17 的第2位变成0
00010111 结果:00010011 0x13
&
11111011 取反:00000100 把1进行变化00000001 ~(1<<2) & 0x17
00011011 0x1b 请把第2位变成1;00011111
00011011
00000100 或运算 00011111
00000100 和00000001 (1<<2) | 0x1b 00011111
以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字
Java位运算:位异或运算位与运算位或运算位取反运算左位移运算右位移运算无符号右移运算不用额外变量交换两个整数的值(使用位异或运算)只出现一次的数字