二进制的位运算
2016-05-22 18:13
253 查看
(1)按位与运算 &
1 & 1 = 1, 0 & 1 = 051 & 5 即 0011 0011 & 0000 0101 =0000 0001 = 1;
(2)按位或运算 |
1 | 0 = 1,1|1 =1, 0|0 =051 | 5 即 0011 0011 | 0000 0101 =0011 0111 =55;
(3)异或运算 ^
1 ^ 1 = 0,1 ^ 0 = 1 ,0^ 0 = 0(两个位的值不同,则结果为1,相同结果为0)51 ^ 5 即 0011 0011 ^0000 0101 =0011 0110=54;
(4)<<左移运算符
1.将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)(注意:java中 整数位 32位)
11 << 2 = 44
-14 <<2 =-56
-14的二进制(11111111 11111111 11111111 11110010)左移2位
为 11111111 11111111 11111111 11001000
结果为(-56)(后面讲述负数在二进制中如何表示的)
(5)>>右移运算符
将一个运算对象的各二进制位全部右移若干位,正数左补0,负数左补1.4
>> 2 = 1;
-14
>> 2 = -4;
(6)~按位取反
~6 = -7(7)>>>无符号右移运算符
二进制各个位向右移指定的位数,右移后左边空出来的位用零来填充,移出右边的位被丢弃。-14 >>> 2 =11111111
11111111 11111111 11110010 => 00111111 11111111 11111111 11111100 =1073741820
(8)<<<无符号左移运算符
二进制各个位向左移指定的位数,左移后右边空出来的位用零来填充,移出左边的位被丢弃。3
<<< 1 = 6
(9)二进制中负数的计算
负数以正数的补码表示原码:一个整数按照绝对值的大小转化成二进制的数
反码:将二进制数按位取反
补码:反码加 1
以-14 举例
原码:14 即 00000000 00000000 00000000 00001110
反码: 11111111 11111111 11111111 11110001
补码: 11111111 11111111 11111111 11110010
所以-14 的二进制是 11111111 11111111 11111111 11110010
假设 我们得到 二进制让我们求整数 就是倒着来取相反数
如二进制是 11111111 11111111 11111111 11110010
得到反码减1 11111111 11111111 11111111 11110001
原码: 00000000 00000000 00000000 00001110
即 1110 = 14 所以取反 就是-14
public static void main(String[] args) { /* * 十进制转化为其他进制 */ //二进制 System.out.println(Integer.toBinaryString(0)); //16进制 System.out.println(Integer.toHexString(112)); //8进制 System.out.println(Integer.toOctalString(112)); /* * 其他进制转化为是十进制 */ //二进制 System.out.println(Integer.parseInt("1110000", 2)); //8进制 System.out.println(Integer.parseInt("71", 8)); //16进制 System.out.println(Integer.parseInt("A1", 16)); }
public class phone { /* * 转化int 为byte数组 */ public static byte[] int2Bytes(int id){ byte[] arr = new byte[4]; // arr[0] = (byte)((int)(id >> 0*8)& 0xff); // arr[1] = (byte)((int)(id >> 1*8)& 0xff); // arr[2] = (byte)((int)(id >> 2*8)& 0xff); // arr[3] = (byte)((int)(id >> 3*8)& 0xff); for (int i = 0; i < arr.length; i++) { arr[i] = (byte)((int)(id >> i*8)& 0xff); } return arr; } /* * 转化byte数组为 int */ public static int bytes2Int(byte[]arr){ // int rs0 = (int)((arr[0]& 0xff) << 0*8); // int rs1 = (int)((arr[1]& 0xff) << 1*8); // int rs2 = (int)((arr[2]& 0xff) << 2*8); // int rs3 = (int)((arr[3]& 0xff) << 3*8); int result =0; for (int i = 0; i < arr.length; i++) { result += (int)((arr[i]& 0xff) <<i*8); } return result; } public static void main(String[] args) { byte[] arr = phone.int2Bytes(8143); System.out.println(arr[0]+","+arr[1]+","+arr[2]+","+arr[3]); System.out.println(phone.bytes2Int(arr)); //字符串与字符数组 String info="好好学习,天天向上"; byte[] barr = info.getBytes(); String des = new String(barr); System.out.println(des); } }
如有不对,请指正!
相关文章推荐
- 内核笔记2-Linux内核进程控制
- listView 点击事件实现方法
- 判断单链表回文
- VB.net学习笔记(二十二)XML的DOM模型读写
- 并发入门
- 第十二周进度条
- [置顶] 组合数学各种小定理
- 页面未随软键盘上升及android隐藏软键盘总结
- c++上机实验6-项目3-矩阵求和
- newLISP运行scp命令并打印进度
- HDU 5699 货物运输 (二分 + 不等式判断 好题)
- Machine Learning - Andrew NG Class02 - 监督学习应用.梯度下降
- vim 格式化文本,调整缩进
- ATL一:CWindowImpl
- CodeForces 23A-You're Given a String...
- iptables超详细解读
- Hdu5696 区间的价值(花式水)
- 动态规划:最长公共子串长度
- 第12课:Spark Streaming源码解读之executor容错安全性
- 百度之星 初赛2 瞬间转移 [杨辉三角]