首页 > 编程 > Java > 正文

java位运算

2019-11-08 19:50:17
字体:
来源:转载
供稿:网友

概述

计算机是以二进制的补码来运算的

原码

符号位加上数字的二进制表示。二进制中最高位“0”表示正数(+),“1”表示负数(-)

反码

正数的反码和原码一样。负数的反码,除了符号位,其他的位数全部取反

补码

正数的补码和原码一样。负数的补码为反码 + 1

运算符

&:与运算(有0则0)|:或运算(有1则1)^:异或运算(相同则0,不同则1)~:取反运算(0变1,1变0)<<:左移(左边最高位丢弃,右边补齐0)>>:右移(最高位是0,左边补齐0;最高为是1,左边补齐1)>>>:无符号右移(无论最高位是0还是1,左边补齐0)

与运算

00000000 00000000 00000000 00000011& 00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000000结果是:0

或运算

00000000 00000000 00000000 00000011| 00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111结果是:7

异或运算

00000000 00000000 00000000 00000011& 00000000 00000000 00000000 00000100 ----------------------------------- 00000000 00000000 00000000 00000111结果是:7

特点:一个数据对另一个数据位异或两次,该数本身不变

public static void main(String[] args) { int a = 10; int b = 20; System.out.PRintln(a ^ b ^ b); //10 System.out.println(a ^ b ^ a); //20}

基于该特点可以做整数的交换,无需中间变量,数据也不会溢出整数范围,而且效率最快

public static void main(String[] args) { int a = 10; int b = 20; a = a ^ b; b = a ^ b; a = a ^ b; System.out.println(a); //20 System.out.println(b); //10}

取反运算

00000000 00000000 00000000 00000011~ 11111111 11111111 11111111 11111100 (补码) 补码:11111111 11111111 11111111 11111100 反码:11111111 11111111 11111111 11111011 原码:10000000 00000000 00000000 00000100结果是:-4

左移 右移 无符号右移

public static void main(String[] args) { //<< 把<<左边的数据乘以2的移动次幂 System.out.println(3 << 2); //3*2^2 = 3*4 = 12; //>> 把>>左边的数据除以2的移动次幂 System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6 System.out.println(24 >>> 2); System.out.println(-24 >> 2); System.out.println(-24 >>> 2);}/*解析: 3 << 2: 3的二进制: 00000000 00000000 00000000 00000011 左移后: (00)000000 00000000 00000000 0000001100 -24 >> 2: 24的二进制:11000 原码: 10000000 00000000 00000000 00011000 反码: 11111111 11111111 11111111 11100111 补码: 11111111 11111111 11111111 11101000 右移后:1111111111 11111111 11111111 111010(00) 补码 补码:1111111111 11111111 11111111 111010 反码:1111111111 11111111 11111111 111001 原码:1000000000 00000000 00000000 000110 结果:-6 -24 >>> 2: 24的二进制:11000 原码:10000000 00000000 00000000 00011000 反码:11111111 11111111 11111111 11100111 补码:11111111 11111111 11111111 11101000 右移后:0011111111 11111111 11111111 111010(00) 结果:...*/
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表