Java Bit Manipulation
Posted 每天更强一点...
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Bit Manipulation相关的知识,希望对你有一定的参考价值。
OR (|) | AND (&) | XOR (^) | Left Shift (<<) | Right Shift (>>) | Not (~) |
1|0=1 | 1&0=0 | 1^0=1 | 0010<<2=1000 | 1100>>2=0011 | ~1=0 |
AND 和 &
num & 1 可以得到整数num二进制表达的最后一位。
Example:
// Get maximum binary Gap. // For example, 9‘s binary form is 1001, the gap is 2. // An integer x & 1 will get the last digit of the integer. public class MaxBinaryGap { public static int getGap(int N) { int max = 0; int count = -1; int r = 0; while (N > 0) { // get right most bit & shift right r = N & 1; N = N >> 1; if (0 == r && count >= 0) { count++; } if (1 == r) { max = count > max ? count : max; count = 0; } } return max; } }
XOR 异或 ^
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
Example:
// Given an array of integers, every element appears twice except for one. Find that single one. public class SingleNumber { public static void main(String[] args) { int[] A = {1, 2, 3, 3, 2, 1, 5}; System.out.print(singleNumber(A)); } public static int singleNumber(int[] A) { int result = A[0]; for(int i = 1; i < A.length; i++) { System.out.println("result: "+result+"; A[i]: "+ A[i]+"; result^A[i]: "+(result^A[i])); result = result ^ A[i]; } return result; } }
<< 移位运算符
java中有三种移位运算符
<< : 左移运算符,num << n, 相当于num乘以2的n次方
>> : 有符号右移运算符,num >>n, 相当于num除以2的n次方。如果是正数,则在高位补0,是负数,则在高位补1 (7 >> 1结果是3,)
>>> : 无符号右移,num >>> n, 将num向右移动n位,无符号右移,忽略符号位,空位都以0补齐
Example:
2<<2, 2 的二进制是00000000 00000000 0000000000000010 (1 int = 4 bytes = 32 bits),它向左移动2 位,就变成了00001000,即8。如果从另一个角度来分析,它向左移动2 位,其实就是乘上2 的2 次方,结果还是8。
System.out.println(Integer.toBinaryString(num)); 可以查看整数的二进制表达。
// Get bit i for a give number n. (i count from 0 and starts from right) public static boolean getBit(int num, int i){ int result = num & (1<<i); if(result == 0){ return false; }else{ return true; } }
整数的二进制表示
1) 有符号和无符号区别
java中只有 int型 而没有 unsigned integer 和 signed之分.
Java 中一个有符号 int 类型的数是 32 位,他可以表示的范围是 -2^31 ~ 2^31-1 之间。那么如何表示负数?左边以 1 开始就是负的。
这就导致了移位操作符有“有符号”和“无符号”之分。这中区分仅存在于右移的时候。因为需要指明右移以后左边流出的空白以 0 还是 1 补,即移位以后的数是正是负
2) 负数的二进制表达
在计算机中,负数以其正值的补码形式表达。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码
比如 00000000 00000000 00000000 00000101 是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
Example
整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。
以上是关于Java Bit Manipulation的主要内容,如果未能解决你的问题,请参考以下文章
Bit Manipulation-476. Number Complement