位运算符

最近又看了下位运算符的内容,自己再次消化后,决定还是记录下来,万一以后再忘了直接看自己的,省的再满世界的去找了。。。

我自己了解到的按位运算符有6个,分别是:

  • & 按位与
  • | 按位或
  • ^ 按位异或
  • >> 右移
  • << 左移
  • >>> 无符号右移
  • ~ 按位非

1、&(按位与):任何二进制位与0进行 & 计算,结果都是0;和1进行&计算,结果是原值。即:二进制位都是1时,进行 & 计算结果是1,其他情况计算结果都是0

  如:6的二进制是:000110,5的二进制是:000101,6 & 5 = 000110 & 000101 = 000100 = 4

2、|(按位或):任何二进制位与0进行 | 计算,结果是原值;和1进行 | 计算,结果都是1。即:二进制位都是0时,进行 | 计算结果是0,其他情况计算结果都是1

  如:6的二进制是:000110,5的二进制是:000101,6 | 5 = 000110 | 000101 = 000111 = 7

3、^(按位异或):任何相同的二进制位进行 ^ 计算,结果是0;不相同的二进制位进行 ^ 计算,结果是1。

  如:6的二进制是:000110,5的二进制是:000101,6 ^ 5 = 000110 ^ 000101 = 000011 = 3

4、>>(右移):二进制从低位进行移除并将剩余的向移动,原先最高位是1补1,是0补0,其它空位补0。右移n位,实现效果等同于除以2的n幂次方

  如:8的二进制是:001000,8 ÷ 2= 8  >> 3 = 001000 = 000001 = 1

5、<<(左移): 二进制从高位进行移除并将剩余的向移动,原先最高位是1补1,是0补0,其它空位补0。左移n位,实现效果等同于乘以2的n幂次方

  如:8的二进制是:001000,1 × 2= 1 << 3 = 000001 = 001000 = 8

6、>>>(无符号右移):二进制从低位进行移除并向右移动,不管原先最高位是1还是0,和其它空位一样补0。对于正数,无符号右移等同于右移,但是如果还是负数进行无符号右移,会出现计算问题。因为二进制最高位是作为符号位来保存的,正数最高位为0,负数最高位为1,而且负数的二进制计算和正数的二进制计算是相反的(即-1的二进制位数值都是1),你品品,你细品。

  如:int类型(32位)-1的二进制是:11111111111111111111111111111111,-1 >>> 1 = 11111111111111111111111111111111 = 01111111111111111111111111111111 = 231 - 1 = 2147483647,

  int类型的(32位)-2的二进制是:11111111111111111111111111111110,-2 >>> 1 = 1111111111111111111111111111111001111111111111111111111111111111 =  231 - 1 = 2147483647

  int类型的(32位)-3的二进制是:11111111111111111111111111111101,-3 >>> 1 = 11111111111111111111111111111101 = 01111111111111111111111111111110 =  230 = 2147483646

7、~(按位非):二进制位进行非运算(~),位是1的结果为0,位是0的结果为1

  如:int类型(32位)-1的二进制是:11111111111111111111111111111111,~-1 = ~(11111111111111111111111111111111) = 0000000000000000000000000000 = 0

  int类型(32位)1的二进制是:00000000000000000000000000000001,~1 = ~(00000000000000000000000000000001) = 11111111111111111111111111111110= -2

posted @ 2020-03-10 09:52  快乐的小乐  阅读(827)  评论(0编辑  收藏  举报