java位操作总结

在计算机中所有数据都是以二进制的形式储存的。

位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。

方便演示,首先写个二进制打印方法:

private static void printNum(int n){
	String num = Integer.toBinaryString(n);
	if(num.length() == 32){
		System.out.println(num);
	}else{
		StringBuilder sb = new StringBuilder("");
		for(int i =0;i < 32 - num.length(); i ++){
		sb.append("0");
		}
		System.out.println(sb.toString() + num);
	}
}

1、~操作符(取反),对应二进制位取反,0变成1,1变成0

int num = 3;
printNum(num);
printNum(~num);

结果如下:

00000000000000000000000000000011
11111111111111111111111111111100

2、&操作符(与),对应二进制位进行与操作,都为1时变成1,其他变为0

int num1 = 3;
int num2 = 7;
printNum(num1);
printNum(num2);
printNum(num1 & num2);

结果如下:

00000000000000000000000000000011
00000000000000000000000000000111
00000000000000000000000000000011

3、|操作符(或)对应二进制位进行或操作,都为0时变成0,其他变为1

int num1 = 4;
int num2 = 7;
printNum(num1);
printNum(num2);
printNum(num1 | num2);

结果如下:

00000000000000000000000000000100
00000000000000000000000000000111
00000000000000000000000000000111

4、^操作符(异或),对应二进制位相同时,该位变成0,否则变成1

int num1 = 5;
int num2 = 9;
printNum(num1);
printNum(num2);
printNum(num1 ^ num2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000001001
00000000000000000000000000001100

5、<<操作(左移),二进制位向左移动,右边填充0

int num1 = 5;
printNum(num1);
printNum(num1 << 2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000010100

6、>>操作(右移),二进制位向右移动,左边填充0

int num1 = 5;
printNum(num1);
printNum(num1 >> 2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000000001

位操作常见应用

1、不使用中间变量交换两个数

int num1 = 2;
int num2 = 5;
num1 = num1^num2;
num2 = num2^num1;
num1 = num1^num2;
System.out.println("num1:" + num1 +"\n"+ "num2:" + num2 );

2、求2的N次方

//求2的32次方:
System.out.println(Math.pow(2, 32));
System.out.println(1L<<32);

3、判断奇数偶数

int num1 = 4;
int num2 = 9;
if(num1%2 == 0){
	System.out.println("偶数");
}else{
	System.out.println("奇数");
}
System.out.println((((int)num1&1) == 1) ? "奇数" : "偶数");
System.out.println((((int)num2&1) == 1) ? "奇数" : "偶数");

4、求绝对值

int num = -3;
System.out.println(Math.abs(num));
int i = num >> 31;
System.out.println(i == 0 ? num : (~num + 1));
时间: 2024-07-30 03:05:09

java位操作总结的相关文章

java 位操作的总结

2014-05-07 17:14 今天工作上需要一个Byte的低5位,高3位.所以查询了资料.总结下如何实现 百度到一个资料: 介绍的很详细 http://www.blogjava.net/zhaomingchao/articles/298318.html 这里就写下代码,来实现他的实例. 工程的位置 : 截图如下: java 位操作的总结,布布扣,bubuko.com

java 位操作 bitwise(按位) operation bit

java 位操作 bitwise(按位) operation bit // 8   0000 0000 0000 1000     原码     1111 1111 1111 0111     反码 +  1 1111 1111 1111 1000     (8的补码)来表示 -8 // -8 1111 1111 1111 1000 65528     补码(正值 的反码+1) // 65535 1111 1111 1111 1111 65535// 65535-65528=7+1=8 操作lo

JAVA 位操作学习

一,基础知识 计算机中数值的编码方式中,原码.反码.补码. 正数的补码与原码相同,负数的补码为:负数的原码符号位不变,其它位取反,再加1. 在计算机中,数值是以补码的形式存储的.补码的好处: ①用补码存储可以减化电路设计,因为它可以将减法转换成加法,简化运算规则,将加减法统一起来了. ②还可以不用考虑符号位,解决了0的两种表示方式:比如,在原码中0的表示有 +0 和 -0 +0=[0000 0000 0000 0000 0000 0000 0000 0000]原 -0=[1000 0000 00

Java位操作全面总结

在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题. 位操作基础 基本的位操作符有与.或.异或.取反.左移.右移这6种,它们的运算规则如下所示: 注意以下几点: 在这6种操作符,只有~取反是单目操作符,其它5种都是双目操作符. 位操作只能用于整形数据,对float和double类型进行位

Java 位操作

Java提供的位运算符有:左移( << ).右移( >> ) .无符号右移( >>> ) .位与( & ) .位或( | ).位非( ~ ).位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符. print Binary: System.out.printIn(Integer.toBinaryString(2)); //result is 10. 1.左移( << ) Test1.将5左移2位: package com.x

java位操作

在搞与c的协议解析的时候,要进行很多的位运算.因为位运算,实际编程中用的不多,这里还是记录一下. c协议过来的数据是16进制的字符串. 首先是将16进制的字符串转换为ByteBuffer. public static ByteBuffer string2Buffer(String source) { ByteBuffer buffer = ByteBuffer.allocate(source.length() / 2); for (int idx = 0; idx < buffer.capaci

java中的位操作

之前做项目的时候使用位操作不是很多,今天在刷leetcode上题目的时候用到了位操作,是leetcode中的第29题Divide Two Integers. 一.java的位操作: 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算.位运算符可以分为逻辑运算符(包括~.&.|和^)及移位运算符(包括>>.<<和>>>). 1)左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0).左移一位(在

java的位运算符(&gt;&gt;,&lt;&lt;,&gt;&gt;&gt;,&amp;,|)

主要总结下java的位运算符的操作.java的位运算符不紧可以提高运行效率,同时也有会意想不到的效果(java.util.ArrayDeque有很好的体现),在后续中会举例说明. 开始说位运算符之前,先简单的复习下补码的知识,然后举个简单的例子说明下计算机中的补码操作(计算机中的加减法). 补码 计算机进行加减法操作时,都是以补码进行操作的,所以java中的位运算都是以补码进行操作的.正数的补码是其本身,而负数的补码为其反码+1.如下例子. 因为java中int型是4个字节,需要32位,为了写起

Google Protocol Buffers 编码(Encoding)

Google Protocol Buffers 编码(Encoding) 1. 概述 前三篇文章<Google Protocol Buffers 概述><Google Protocol Buffers 入门><Protocol Buffers 语法指南> 一步一步将大家带入Protocol Buffers的世界,我们已经基本能够使用Protocol Buffers生成代码,编码,解析,输出级读入序列化数据.该篇主要讲述PB message的底层二进制格式.不了解该部分内