java 位操作的总结
2014-05-07 17:14 今天工作上需要一个Byte的低5位,高3位。所以查询了资料。总结下如何实现
百度到一个资料:
介绍的很详细
基础知识:
http://www.blogjava.net/zhaomingchao/articles/298318.html
位运算的应用:(非常全面的总结)
http://blog.csdn.net/morewindows/article/details/7354571
这里就写下代码,来实现他的实例。
package cn.wuwenfu.bytedemo;
public class ByteDemo {
public static void main(String[] args) {
//位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
//<< 各个处理器是不同处理的。尤其是有符号的 数 要注意。,有的补符号位(算术右移),有的补0(逻辑右移)
// 二进制负数以它正值的补码形式表达
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("整数5取反后的二进制字符串为:" + Integer.toBinaryString(~5));
System.out.println("整数5取反 加 1的二进制字符串为:"
+ Integer.toBinaryString(~5 + 1));
System.out.println("负5的二进制字符串" + Integer.toBinaryString(-5));
System.out.println("---------------------------------------");
//java ~ 操作符,对每个二进制位的内容求反,即1变成0,0变成1
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("整数5取反后的二进制字符串为:" + Integer.toBinaryString(~5));
System.out.println("---------------------------------------");
//java & 操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
System.out.println("5&4的二进制字符串为:"+Integer.toBinaryString(4&5));
System.out.println("---------------------------------------");
//java | 操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
System.out.println("5|4的二进制字符串为:"+Integer.toBinaryString(4|5));
System.out.println("---------------------------------------");
//java ^ 操作符 当对应二进制位值相同,该位为0 否则为1
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("整数4的二进制字符串为:" + Integer.toBinaryString(4));
System.out.println("5^4的二进制字符串为:"+Integer.toBinaryString(5^4));
System.out.println("---------------------------------------");
//java << 操作符,左边移动,右面填充0
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("5<<4的二进制字符串为:"+Integer.toBinaryString(5<<4));
System.out.println("---------------------------------------");
//java >> 操作符,左边移动,右面填充0
System.out.println("整数5的二进制字符串:" + Integer.toBinaryString(5));
System.out.println("5>>4的二进制字符串为:"+Integer.toBinaryString(5>>4));
System.out.println("---------------------------------------");
//应用的实例
System.out.println(" 5 ×2 = "+5*2);
System.out.println(" 5 <<1 = "+ (5<<1));
System.out.println("---------------------------------------");
//这里是将字节转为整数,不是很明白。只是发现计算的结果 192+64 =256 是一个字节的长度
System.out.println(" -64&0xFF = "+(-64&0xFF));
System.out.println(" 0xFF ="+Integer.parseInt("FF",16));
System.out.println("---------------------------------------");
//比较数是否相等.0表示相等,其他值表示不相等
System.out.println(" 1^1 比较是否相等 : "+(1^1));
System.out.println(" 20 ^20 比较是否相等 : "+ (20 ^ 20));
System.out.println("20 ^ 1 比较是否相等:"+(20^1));
System.out.println("0x65 ^ 0x65 比较是否相等:"+(0x65^0x62));
System.out.println("---------------------------------------");
//判断奇偶
for (int i = 0; i < 50; ++i){
if((i&1) == 0){
System.out.println("发现的偶数:"+i);
}
}
System.out.println("---------------------------------------");
//交换2个数,不使用临时变量
int a =3;
int b =4;
if(a != b){
a ^= b;
b ^= a;
a ^= b;
}
System.out.println("a ="+a);
System.out.println("b = "+b);
System.out.println("---------------------------------------");
//变换符号
//这里可能大家觉得没用,但是如果 a的符号我们不清楚,估计就有用了。
System.out.println(" 7 变换符号后:"+ (~7+1));
System.out.println(" -7 变换符号后:"+ (~-7+1));
System.out.println("---------------------------------------");
//计算绝对值
System.out.println(" 7 的绝对值:"+ my_abs(7));
System.out.println(" -7 的绝对值:"+ my_abs(-7));
System.out.println("---------------------------------------");
// 高低位交换
System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
System.out.println("34520>>8的字符串:"+Integer.toBinaryString(34520>>8));
System.out.println("34520<<8的字符串:"+Integer.toBinaryString(34520<<8));
//交换 它的前 8 与后8 这里需要截取。否则超出16位。
String str = Integer.toBinaryString( (34520>>8)|(34520<<8));
System.out.println("34520的交换位置:"+str);
System.out.println("34520的交换位置并只保留16位:"+str.substring(str.length()-16,str.length()).trim());
System.out.println("---------------------------------------");
//二进制逆序
System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
a =34520;
a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1);
a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2);
a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4);
a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8);
System.out.println("34520的二进制字符串逆序后为:"+Integer.toBinaryString(a));
System.out.println("---------------------------------------");
//计算二进制1的个数
System.out.println("34520的二进制字符串为:"+Integer.toBinaryString(34520));
a =34520;
a = ((a & 0xAAAA) >> 1) + ((a & 0x5555) );
a = ((a & 0xCCCC) >> 2) + ((a & 0x3333) );
a = ((a & 0xF0F0) >> 4) + ((a & 0x0F0F) );
a = ((a & 0xFF00) >> 8) + ((a & 0x00FF) );
System.out.println("34520的二进制字符串中1的个数为:"+a);
System.out.println("---------------------------------------");
//查出单独的一个数字,只出现一次的数字
int[] arr = {1, 347, 6, 9, 13, 65, 889, 712, 889, 347, 1, 9, 65, 13, 712};
int lostNum = 0;
for (int i = 0; i < 15; i++){
lostNum ^= arr[i];
}
System.out.println("缺失的数字为:"+lostNum);
System.out.println("---------------------------------");
//指定整数的某一个位位0还是1
//这里是制定第二位为1
int j =34520;
System.out.println("34520 的二进制位:"+Integer.toBinaryString(j));
System.out.println("34520的第二位放1: "+Integer.toBinaryString(j|1<<1));
System.out.println("---------------------------------");
//判断某个整数 制定的位上 是 0还是1
//这里查看的是第二位
//原理是:1的二进制位00000001
//1<<1变成了 00010;
//再取与, 只有都为1时才1;其他的均为0;
//因此j的第二位 为 0 时 则 结果为 0
if((j&(1<<1)) !=0){
System.out.println("指定位上为1");
}else{
System.out.println("指定位为0");
}
//利用的 是 & 的效果
//取某个数的指定的几位
System.out.println("34520 的二进制位:"+Integer.toBinaryString(34520));
//直接与0xFF :11111111
System.out.println("34520的低八位:"+Integer.toBinaryString(34520&0xFF));
//直接与 0xFF00 :1111111100000000
System.out.println("34520的高八位:"+Integer.toBinaryString((34520&0xFF00) >>8));
//3位
//直接与0x1F :11111
System.out.println("34520的低5位:"+Integer.toBinaryString(34520&0xFF));
//直接与 0xE000 :1110000000000000
System.out.println("34520的高3位:"+Integer.toBinaryString((34520&0xE000) >>13));
}
//求绝对值得方法
private static int my_abs(int a){
int i = a>>31;
//return i==0? a:(~a+1);
return (a^i)-i;
}
}
位操作实例
其实位操作,平时用的很少,主要是不知道有什么用。
网上查了下资料,使用位操作的好处:
速度超快,这些都是底层的二进制机器操作指令。
实际的使用例子:
1、如 a*2 ,我们可以用 a<<1 来代替。 依次可以推出 a ×4 ,可以用 a<<2
2、通过 & 可以把字节转换为整 数,-64&0xFF=192 这里的 0xFF 是字节的十六进制表示。
3、 通过 ^ 可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。 20^20==0
4、其他的应用在代码中
截图如下:
java 位操作的总结的更多相关文章
- Java位操作全面总结
转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...
- JAVA 位操作学习
一,基础知识 计算机中数值的编码方式中,原码.反码.补码. 正数的补码与原码相同,负数的补码为:负数的原码符号位不变,其它位取反,再加1. 在计算机中,数值是以补码的形式存储的.补码的好处: ①用补码 ...
- Java位操作全面总结[ZZ]
Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千 ...
- java 位操作 bitwise(按位) operation bit
java 位操作 bitwise(按位) operation bit //一篇对于 原码 反码 补码 的介绍 http://www.cnblogs.com/zhangziqiu/archive/201 ...
- 一道面试题与Java位操作 和 BitSet 库的使用
前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...
- java位操作总结
在计算机中所有数据都是以二进制的形式储存的. 位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快. 方便演示,首先写个二进制打印方法: private static void ...
- Java位操作
无论说是在哪一门计算机语言,位操作运算对于计算机来说肯定是最高效的,因为计算机的底层是按就是二进制,而位操作就是为了节省开销,加快程序的执行速度,以及真正的实现对数的二进制操作. 使用位操作 ...
- 可能是最通俗易懂的 Java 位操作运算讲解
https://blog.csdn.net/briblue/article/details/70296326
- 通俗易懂的 Java 位操作运算讲解
所有数值都是2进制 软件开发者都知道 10 进制.16 进制.8 进制. 比如数字 10 的各位进制形式表现如下. 十进制:10 八进制:012 十六进制:0x0a 二进制:1010 原码 反码 补码 ...
随机推荐
- magento head.phtml 加载<a target=_parent
<script language="javascript">function alinks(){ var links = document.getElementsBy ...
- springMVC下载文件前修改文件名字
很多时候,为了方便,下载文件其实就直接写了一个文件在服务器上面的路径,然后直接点击一个这个地址,浏览器就自然而然的开始下载了. 但是这次项目需要在文件下载之前修改文件的名字,也就是说,服务器上文件的名 ...
- STM32中断触发
使用PB1作为外部中断触发,按一次按键灯处于亮状态,在按一次灯灭. 1.先配置GPIO端口.复用管脚外设时钟使能GPIO_Config(); void GPIO_Config(void) { GPIO ...
- jquery获取页面相关尺寸
$(windows).width();获取页面可视宽度 $(windows).height();获取页面可视高度 $(document).height();获取页面内容的总高度 $(document) ...
- 使用cisco SDM管理路由器
实验拓扑: 实验目的:掌握如何通过SDM对路由器进行管理 实验需求:设置R1使其能够通过SDM进行管理 实验步骤: 步骤一:配置基本IP地址 步骤二:在R1上进行设置,使其能够通过SDM连接 R1(c ...
- angular 实现modal windows效果(即模态窗口,半透明的遮罩层),以及bootstrap(css,components,js)的初步学习
废话不说,直接上代码.可直接看效果,对着分析..今天算是bootstrap 入门了,开心.. 突然居然很多事情就是那样,不要太多的畏惧,迈出第一步其实就成功了一半了. <html ng-app= ...
- CodeForces 158DIce Sculptures(枚举)
一个暴力的枚举,枚举组成正多边形需要对应覆盖原先的几条边,范围为(1,n/3),然后维护最大值就可以了,注意初始化为-inf. #include<stdio.h> #include< ...
- Robot Framework用法总结
今天总结下Robot Framework最基本的用法,一来呢,希望自己以后看到这篇总结,很快能回忆起如何使用Robot Framework.二来呢,以初学者的姿态总结Robot Framework,希 ...
- python赋值和拷贝----一切皆对象,参数皆引用
摘要: 1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用. 2 python参数传递都是"传对象引用"方式.实际上相当于c++中传值和传引用的结合. 3 如 ...
- python之路:进阶 二
c = collections.Counter( Counter({ b = collections.Counter( b.update(c) Counter({ Counter({ ...