二进制位运算应用
来源:互联网 发布:淘宝购物优惠微信群 编辑:程序博客网 时间:2024/05/21 17:43
常见的二进制位运算:
运算符运算示例&与运算6&3=2|或运算6|3=7^异或运算6^3=5~反码~6=-7<<左移3<<2=12相当于3*2*2=12>>右移3>>1=1相当于3/2=1>>>无符号右移3>>>1=1相当于3/2=1二进制位运算优点:特定情况下,计算方便,速度快,被支持面广
如果用算数方法,速度慢,逻辑复杂
按位与 &:
两位全为1,结果才为1
0&0=0; 0&1=0; 1&0=0; 1&1=1;
例如:51&5 即0011 0011 & 0000 0101=0000 0001 因此51&5=1
位运算的特殊用法
(1) 清零。
若想将一个单元清零,即 使其全部二进制位为零,只要与一个各位都为0的数值,结果为0
(2)取一个数中指定位
例:设X=10101110,取X的低4位,用X&0000 1111=0000 1110即可得到
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为0,此数与X进行"与运算"可以得到X中指定的位
按位或 |:
只要有一个为1,结果就为1
0|0=0; 0|1=1; 1|0=1; 1|1=1;
例如:51|5 即0011 0011 | 0000 0101=0011 0111 因此51 | 5=55
或运算的特殊用法
常用来对数据的某些位置1
例:将X=10100000的低4位置1,用10100000 | 00001111=10101111即可得到
方法:找到一个数,对应X要置1的位,该数的对应位为1,其余为0,此数与X相或可使X的对应位置1
异或运算 ^:
两个相应位为"异"(值不同),则"异或"结果为1,否则为0
0^0=0; 0^1=1; 1^0=1; 1^1=0;
例如:51^5 即 0011 0011 ^ 0000 0101=0011 0110 因此51 ^ 5=54
异或运算的特殊用途
(1)使特定位翻转
找一个数,对应X要翻转的各位,该数对应位1,其余位为0
如:X=1010 1110,使X低四位翻转,用X ^ 0000 1111=1010 0001即可得到
(2)与0相异或,保留原值
例:X ^ 0000 0000=X
(3)两个变量交换值
一般的方法有:借助第三个变量实现(C=A;A=B;B=C)
利用加减法实现两个变量的交换(A=A+B;B=A-B;A=A-B)
不过用位异或运算来实现,还是效率最高
原理:一个数异或本身等于0;异或运算符符合交换率
如:A=A^B; B=A^B; A=A^B;
无符号右移运算>>>:
各个位向右移指定的位数,右移后左边空出的位用0填充,移出右边的位被丢弃
例如:-14>>>2
即 11111111 11111111 11111111 11110010 >>>2=00111111 11111111 11111111 11111100 即1073741820
JAVA内置的进制转换
十进制转换十六进制: Integer.toHexString(int i)
十进制转换八进制:Integer.toOctalString(int i);
十进制转换二进制:Integer.toBinaryString(int i)
十六进制转换十进制:Integer.parseInt("FFFF",16);
八进制转换十进制:Integer.parseInt("376",8).;
二进制转换十进制:Integer.parseInt("0101",2);
数据类型转换字节
例: 8143(00000000 00000000 00011111 11001111)
=>byte[] b=[-49,31,0,0]
第一个低端字节:8143>>0*8&0xff=110011111=207(或有符号-49)
第二个低端字节:8143>>1*8&0xff=00011111=31
第三个低端字节:8143>>2*8&0xff=00000000=0
第四个低端字节:8143>>3*8&0xff=00000000=0
大小端
小端法:低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端
大端法:低位字节排放在内存的高地址端,高位字节排放在内存的低地址端即该值的起始地址
例如:32位宽的数0x12 34 56 78
小端模式下CPU内存中的存放方式为:
内存地址0x40000x4001ox40020x4003存放内容0x780x560x340x12
大端模式下CPU内存中的存放方式为:
内存地址0x40000x40010x40020x4003存放内容0x120x340x560x78参考文章:http://blog.csdn.net/iukey/article/details/7195265
- 二进制位运算应用
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算
- 二进制位运算符
- Python的二进制位运算
- Python的二进制位运算
- 二进制位运算积累备忘
- 进算计二进制位运算
- Java之二进制位运算
- 二进制位的应用
- 二进制位运算模拟所有情况。
- 二进制位运算实现权限系统
- Java “lambda expressions not supported at this language level”
- 第三周项目2 建设 顺序表 算法库
- JVM类加载机制详解(二)类加载器与双亲委派模型
- JDBC保存、读取大文本数据类型
- NYOJ 45 棋盘覆盖 (大数问题)
- 二进制位运算应用
- 爬动的蠕虫
- Android进阶二:序列化总结(基础篇)
- 快速排序
- push 0x******* retn 的应用
- oracle数据增删改
- 深入理解PHP:高级技巧、面向对象与核心技术(原书第3版) -- 设计模式之组合模式
- LeetCode 90. Subsets II
- hdu6213 Chinese Zodiac