`
oham_一1一
  • 浏览: 49673 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

位操作笔记(Java)

阅读更多

位操作运算简介

 

取反(NOT)

取反是一元运算符, 对一个二进制数的每一位执行逻辑操作。使数字1成为0, 0成为1。例如:
NOT 0111(十进制 7) = 1000 (十进制 8)
Java 中,取反操作符用波浪线"~"表示。值得注意的是此操作符与"逻辑非(!)" 操作符不同,"逻辑非"并不是一个位操作。
 

按位或(OR)

按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如
0101 (十进制 5) OR 0011 (十进制 3) = 0111 (十进制 7)
java中,按位或操作符是"|"
按位或能够将每一位看做旗帜;在二进制数中的每一位可以表示不同的布尔变量。应用按位或操作可以将二进制数的某一位设为1。例如
0010(十进制 2)
能够看做包含4个旗帜的组合。第1,2,4旗帜为0;第3个旗帜为1。利用按位或可以将第1个旗帜设置为1,而其他旗帜不变。
0010 (十进制 2) OR 1000 (十进制 8) = 1010 (十进制 10)
这一技巧通常用来保存程序中的大量布尔变量。
 
按位异或(XOR)
按位异或运算,对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作,操作的结果是如果某位不同则该位为1,否则该位为0,例如
0101 XOR 0011 = 0110
java中,按位或操作符是"^"
汇编语言的程序员们有时使用按位异或运算作为将寄存器的值设为 0 的捷径。用值的自身对其执行按位异或运算将得到 0。并且在许多架构中,与直接加载 0 值并将它保存到寄存器相比,按位异或运算需要较少的中央处理单元时钟周期。
按位异或也可以用于在比特集合中换旗帜。给出一个比特模式,
0010
第一和第三位能够通过按位异或运算使用同时切换.
0010 XOR 1010 = 1000
这一技巧可用于操作表示布尔变量的比特模式.
 
按位与(AND)
按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1,否则为0。例如:
0101 AND 0011 = 0001
在Java中,按位与用'&'表示。
 
位移
移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。在Java中,左移使用两个小于符号"<<"表示,右移使用两个大于符号">>"表示。">>" 右移,高位补符号位” 这里右移一位表示除2 ">>>" 无符号右移,高位补0”; 与>>类似。
应用逻辑移位时,移位后空缺的部分全部填0.
0001 (十进制 1) << 3 (左移 3 位) = 1000 (十进制 8) 1010 (十进制 10) >> 2 (右移 2 位) = 0010 (十进制 2)
 

来一个Long 与 byte[]互相转换的例子。

 

package org.oham.testbyte;

public class TestByte {

	
	//将Long类型变量转换为字节数组
	private byte[] _transLongToByte(long num)
	{
		byte[]b = new byte[4];// 创建一个4字节的长的字节数组存储Long数据
		
		/* 
		 * 1字节8位,超出的位被截, 不足者补0
		 * 第一次移动24位, b[0] = 00000000
		 * 第二次移动16位, b[1] = 00000011
		 * 第三次移动8位 , b[2] = 00001000
		 * 第四次移动0为, b[3] = 00110010
		 */
		for( int i=0; i< b.length; i++ )
		{
			b[i] = (byte)(num >>> (24 - i*8));
		}
		
		return b;
	}
	
	/*
	 * 思路为 : 遍历字节数组时,每次取出数据赋予
	 * 一个变量后左移8位,然后待遍历的下次,将取出的
	 * 的字节数据与变量拼接,再左移动8位,如此类推。。。
	 * 
	 * 第一次情形: 00000000  |   (00000000 & 11111111)   -->   00000000
	 * 第二次情形: 0000000000000000  |   (00000011 & 11111111)   -->   0000000000000011
	 * 第三次情形: 000000000000001100000000  |   (00001000 & 11111111)   -->   000000000000001100001000
	 * 第四次情形: 00000000000000110000100000000000  |   (00110010 & 11111111)   -->   0000000000000011000010000000000000110010
	 * 
	 * 最后略去高位0,得:11000010000000000000110010  即为198706
	 * 
	 */
	private Long _transByteToLong(byte[] b)
	{
		int mark = 0xFF;  // 二进制:11111111
		int tmp = 0;   // 用于缓存每次遍历取出的数据
		long res = 0;  
		
		for( int i=0; i< 4; i++ )
		{
			res = res << 8; // 左移8位
			
			tmp = b[i] & mark; // 与11111111进行按位与运算, 得到的是自身,另外是保证其得到8位二进制表示
			
			// 进行按位或运算,这里就是拼接动作,由于res初始为0,所以运算结果为自身,左移8位后
			// 低8位尽然为0,所以与tmp的按位或就相当与res接上tmp
			res |= tmp;  
			
			
			System.out.println(res + "----==------" + Long.toBinaryString(res));
		}
		
		return res;
	}
	
	
	public void testByte()
	{
		long num = 198706;  //110000100000110010, 其二进制表示
		byte[] b = this._transLongToByte(num);
		
		long res = this._transByteToLong(b);
		
		System.out.println(res);
	}
	
	public static void main(String[] args) 
	{
		TestByte test = new TestByte();
		
		test.testByte();
	}
}

 此例只是示范,位操作灵活,技巧性很强,与正则类型,很难一时间精通,附上http://bbs.csdn.net/topics/70288919,有空再作总结。
  

 

分享到:
评论

相关推荐

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 书籍 计算机书籍  《java jdk 7学习笔记》是作者多年来教学实践经验的总结...

    java summary(java笔记)

    学习java的一些笔记和个人总结 9、Collection 和 Collections的区别。  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.。Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种...

    java基础,笔记03

    非 是逻辑运算符 只有一个操作数 取反 是位运算符 对二进制表示的数值进行运算 int a 3; int b 2; boolean b9 a++ &gt; b &amp; a % b++ 1 &amp; a &lt; b ; 3&gt;1 &amp; 3%1 1 a 4 b 1 a 3 b 2 ...

    c#学习笔记.txt

    Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...

    leetcode中国-java-notes:Java技术摘要(个人学习笔记),主要记录一些Java及面试相关的知识点。包括Java基础、Jav

    技术面试必备基础知识、Leetcode、计算机操作系统、计算机网络、系统设计 「Java 学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。 蘑菇街敖丙的 Java 面试总结 虫洞栈 Java 干货,面试问题带着...

    Java笔记(一)——基础语法

    文章目录Java 概述及版本HelloWorld变量常量数据类型String运算符算术运算符位运算符逻辑运算符关系运算符关系优先级关键字和语句方法流程控制数组用户输入操作 Java 概述及版本 Java 是由 Sun Microsystems 公司于 ...

    IPAddress:Java库,用于处理IPv4和IPv6的IP地址和子网

    作为库,它还可以与 , , 和互操作。 版 笔记 需要Java 6或更高版本 需要Java 8或更高版本 需要Java 8或更高版本,具有MAC地址支持,与IPv6的EUI-48和EUI-64 MAC集成,新地址框架,新的IP字符串格式已解析和...

    net学习笔记及其他代码应用

    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,...

    java8rt.jar源码-coderfun:《码农翻身》笔记

    java8 rt.jar源码 coderfun 码农翻身笔记 1 计算机的世界你不懂 地址的动态重定位 ...每个程序都可以分为代码段,数据段,堆栈段,操作系统记录每个段的起始和结束地址,以及每个段的保护位,在段的内

    JavaSourceCodeAnalysis:JDK二进制阅读笔记,包括Java常用集合类和Java常用和发工具(同步工具,线程安全集合,线程池)两个部分-java source code analysis

    java.util中的集合 列表,堆栈和队列 | ArrayList是基于串联实现的线性表,没有最大容量限制(实际上有,是Integer.MAX_VALUE),可扩容。LinkedList是基于串联实现的线性表(双向链表),没有最大容量限制。 ...

    java-webapp-coding-week

    全国编码周 ... 单击“ jdk-8u51-windows-x64.exe”以下载64位Java版本。 下载文件后,双击exe文件开始安装并按照屏幕上的说明进行操作。 有关Windows安装的更多详细信息,请。 苹果系统 导航到

    java8rt.jar源码-JVM:学习JVM

    2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个 方法从调用到执行完成的过程中,就对应...

    2009达内SQL学习笔记

    rollback:回溯,回溯到上次操作前的状态,把这次事务操作作废,只有一次(DDL和DCL语句会自动提交,不能回溯)。 可以用commit语句提交,这样就回溯不回了。 set pause on\off :设置分屏(设置不分屏) set pause...

    精髓Oralcle讲课笔记

    --(函数round() 进行四舍五入操作) 35、select round(23.232, 2) from dual; --(四舍五入后保留的小数位数 0 个位 -1 十位) 36、select to_char(sal, '$99,999.9999')from emp; --(加$符号加入千位分隔符,保留...

    leetcode中国-SudokuSolve:用于解决数独谜题的Java实现

    leetcode中国数独解决 ...位操作以加速 Set Union。 使用一个 int 数组作为一个堆栈来避免递归。 减少搜索树深度的特定顺序。 这个解决方案可以超过提交总数的90%,更多详情请点击,文章是中文写的。

    软件测试面试题总结

    计算机网络(tcp/ip详解卷1、谢希仁的计算机网络)、数据库(sql必知必会、数据库案例应用)、操作系统(现代操作系统、清华的公开课)、数据结构和算法(剑指offer、大话数据结构、leetcode只做了一点、还有牛客上...

    leetcode2sumc-LeetCode:C/Java/Python解决方案

    leetcode 2 和 ...位操作 # 标题 解决方案 困难 笔记 136 简单的 231 简单的 461 简单的 476 简单的 细绳 # 标题 解决方案 困难 笔记 14 简单的 28 简单的 指数 58 简单的 67 简单的 125 简单的 344

    JavaScript笔记

    i++)--等同Java Array倒转:arr.reverse();用于颠倒数组中元素的顺序 17.Array元素操作: |--arr.push(x);向数组增加1个新元素x(位于数组最后位置) |--arr.splice(开始位置,删除几个[,x1,x2,x3...]) |--arr...

    LeetCode-Solutions:我的Leetcode解决方案

    演算法哈希表数学两个指针种类递归二元搜寻二进制搜索树广度优先搜索深度优先搜索回溯动态编程贪婪的图形几何学设计 数据库SQL 壳Shell脚本 位操作# 标题解决方案时间空间困难标签笔记136 单号Java Python Scala 上...

Global site tag (gtag.js) - Google Analytics