位运算符的介绍
首先介绍一下“位”,
数值或字符在内存内都是被存储为0和1的序列,每个0和1被称之为1个位,比如说10进制数据2在计算机内被存储为 0 0 0 0 0 0 1 0(此处以一字节为例),当我们将内存内的位值改变之后,这个值代表的意义也就变了,比如把2前移动一位, 现在存储单元里面变成了0 0 0 0 0 1 0 0,这个值表示的是十进制的4,这也就是按位操作符的运算原理。
& :位与
运算法则:
全1则1,有0则0。
| :位或
运算法则:
有1则1,全0则0。
~ :按位取反
运算法则:
1取反得0,0取反得1
^ : 按位异或
运算法则:
相同为0,不同为1
<< : 按位左移
左移几位,右边补几个0
>>: 按位右移
右移几位,左边补几位符号位
位与运算
0xab & 0x3c
1010 1011
& 0011 1100 (ab与3c进行与运算,全1则1,有0则0。)
= 0010 1000
= 0x28
位或运算
0xab | 0x3c
1010 1011
| 0011 1100 (ab与3c进行或运算,有1则1,全0则0。)
= 1011 1111
= 0xbf
~ :按位取反运算
~ 0x3c
0011 1100
~=1100 0011 (按位取反)
= 0xc3
~60
正数原码 0011 1100
正数补码 0011 1100
~= 1100 0011
负数补码 1100 0011
负数原码 1011 1101 (负数补码转原码,符号位不变,末位加1)
=- 61
~(-25)
负数原码 1001 1001
负数补码 1110 0111 (负数补码转原码,符号位不变,末位加1)
~= 0001 1000
正数补码 0001 1000
正数原码 0001 1000 (正数补码转原码)
= 24
~x = -(x+1)
^ : 按位异或运算
0xab ^ 0x3c
1010 1011
^ 0011 1100 (相同为0,不同为1)
= 1001 0111
= 0x97
<< : 按位左移运算
运算公式(有条件)
x << n = x * 2^n
10 << 2 = 40
25 << 2 = 100
8 << 3 = 64
-12 << 3 =
负数原码 1000 1100
负数补码 1111 0100
<< 3 1010 0000 (数往左已,多位补0)
负数补码 1010 0000
负数原码 1110 0000
= 96
>>: 按位右移运算
运算公式(有条件)
x >> n = x / 2^n
32 >> 2 = 8
48 >> 2 = 12
- 48 >> 2 = -12
负数原码 1011 0000
负数补码 1101 0000
>>2 1111 0100 (右移一位补一位符号位)
负数补码 1111 0100
负数原码 1000 1100
= -12
-50 >> 2 = -13 -50 / 4 = -12 -50 >> 2 = -50 / 4 = -13
负数原码 1011 0010
负数补码 1100 1110
>>2 1111 0011
负数补码 1111 0011
负数原码 1000 1101
= -13
置位问题
例1:
将num的第四位置1
num = 0xab
1010 1011
| 0001 0000
1011 1011
num = num | (1<<4)
例2:
将num的第五位置0
num = 0xab
1010 1011
& 1101 1111
1000 1011
num = num & ~(1<<5)