Java基础-位运算总结与海明距离

1.基础语法

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

除去~以外,其他均为二元运算符,操作数只能为整型或者字符型数据。
Java使用 补 码 来 表 示 二 进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。

补 码 的 规 定 如 下 :

  • 对 正 数 来 说 ,最高位为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
  • 对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。如 -1的补 码 为11111111111111111111111111111111(00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。
  • 为何有那么多0、1,java中int是32位的。

1.1.按位与(&)

操作数1操作数2结果
000
010
100
111

例如:0011 & 0101 = 0001

1.2.按位或(|)

操作数1操作数2结果
000
010
100
111

例如:0011 | 0101=0111

1.3.按位非(~)

操作数1结果
01
10

例如:~01=10
Java求负数的源码中使用了按位非运算。

1.4.按位异或(^)

操作数1操作数2结果
000
011
101
110

例如:0011^0101=0110

1.5.左位移(<<)

算术左移,符号位不变,低位补0,如2<<2结果为8;
溢出截断:移动超出的部分截断。
例如:
2:0000000000000000000000000000010
2<<2 = 8
8:000000000000000000000000000001000

1.6.右位移(>>)

算术右移,符号位不变,高位补符号位,如-6>>2结果为-2;
溢出截断:移动超出的部分截断。
-6: 11111111111111111111111111111010
-6>>2=-2
-2: 1111111111111111111111111111111010

1.7. 无符号右移(>>>)

低位溢出,高位补0,无符号右移>>>中符号位(最高位)也跟着变!
如-1>>>1= 2147483647(Integer.Max)
-1 : 111111111111111111111111111111111
-1>>>1
Max: 0111111111111111111111111111111111

2.位运算使用场景

2.1.判断一个数n的奇偶性

n&1 == 1 ? “基数”:“偶数”

2.2不用临时变量交换两个数

public static int[] reverse(int[] nums){
       int i = 0;
       int j = nums.length-1;
       while(j>i){
           nums[i]= nums[i]^nums[j];           
           nums[j] = nums[j]^nums[i];           
           nums[i] = nums[i]^nums[j];          
           j--;           
           i++;
      }       
      return nums;   
 }

原理:a^(b^a) = b
a = a^b;
b = b^a; // b^(a^b) =>b=a
a = a^b; // (a^b)b^(a^v) => a=b

2.3.取绝对值

(a^(a>>31))-(a>>31)

2.4.海明距离

定义

在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离。(百度百科)

两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。

作用:

  1. 用于编码的检错和纠错

为了检测d个错误,需要一个海明距离为d+1的编码方案。因为在这样的编码方案中,d个1位错误不可能将一个有效码字改编成另一个有效码字。当接收方看到一个无效码字的时候,它就知道已经发生了传输错误。类似地,为了纠正d个错误,需要一个距离为2d+1的编码方案,因为在这样的编码方案中,合法码字之间的距离足够远,因而即使发生了d位变化,则还是原来的码字离它最近,从而可以唯一确定原来的码字,达到纠错的目的。

  1. simhash算法中文本相似度计算也用到了海明距离。

simhash算法将文本表示为64位的二进制hash值,通过计算两个hash值之间的海明距离来代表两个文本间的相似程度。

计算方法:

计算海明距离的一种方法,就是对两个位串进行异或(xor)运算,并计算出异或运算结果中1的个数。例如110和011这两个位串,对它们进行异或运算,其结果是:
110^011=101
异或结果中含有两个1,因此110和011之间的汉明距离就等于2。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值