二月十八日记录。
一、位运算操作符
1.“与”运算符
按位“与”运算符“&”是双目运算符,功能是使参与运算的两数各对应的二进位相“与”。当两个对应的二进位均为1时,结果为1;当两个均为0或有一个为0时,结果为0。
a | b | a&b |
1 | 1 | 1 |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
例如,当我们计算89&38时:
89 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
38 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
89&38 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
此时我们可以发现:按位“与”的一个作用是清零。若要使特定位置的1变为0,只需使该1与0进行按位“与”操作即可。
按位“与”的另一个作用是取特定位。若要取某一数的后五位,则只需使用一个后五位均为1的数与其进行按位“与”操作即可。
2.“或”运算符
按位“或”运算符“|”是双目运算符,功能是使参与运算的两数各对应的二进位相“或”。只要对应两个二进位中有一个为1,结果就为1。
a | b | a|b |
1 | 1 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
对应于“与”运算,“或”运算的一个功能是,要想使某个数后六位全为1,只需将该数与63按位“或”即可,即后六位均与1进行“或”运算,结果均为1。
3.“取反”运算符
“取反”运算符“~”是单目运算符,具有右结合性。功能是对参与运算的数的各二进位进行按位取反,即0变1,1变0。
4.“异或”运算符
按位“异或”运算符“^”是双目运算符。功能是使参与运算的两数各对应的二进位相“异或”,当两个二进位数相异时结果为1,相同时结果为0。
a | b | a^b |
1 | 1 | 0 |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
“异或”运算的一个主要用途是使特定位翻转,如若想要使某数后7位翻转,则只需与一个后7位都是1的数进行“异或”操作即可。
“异或”运算的另一个用途,是在不适用临时变量的情况下实现两个变量值的互换。
例如:令x = 9,y = 4,此时我们可以:
具体过程如下:
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | x |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | y |
x = x ^ y | ||||||||
0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | x |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | y |
y = y ^ x | ||||||||
0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | x |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | y |
x = x ^ y | ||||||||
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | x |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | y |
5.“左移”运算符
“左移”运算符“<<”是双目运算符,它将“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数决定左移位数,高位丢弃,低位补0。
例如:39 << 2
0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
39 << 2 | |||||||
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
6.“右移”运算符
与“左移”运算符相反。
但应注意低位丢弃,高位在正数时补0,负数时取决于编译系统,补0则为逻辑右移,补1则为算数右移。
7.循环移位
循环移位是将某数的二进制数中的低数位移至高数位或者将高数位移至低数位。
1.循环左移
将x的左端n位移到右端
2.循环右移
将x的右端n位移到左端
思想与“用临时变量实现两数互换”类似。