继续最近想更的东西很多,也对以前的知识有了新的看法,PS最近看了几部像吃了shi一样的电影推荐给大家,《消失的爱人》 《月球》
最近新起项目,从底层搭建,在写一个发送信息或短信的接口,正好用到了Java的位运算,写博客保存,也是装逼的好方法。
以前了解到位运算,但是实际确很少碰到,这次也是一个特别简单的方法,先上示例:
PS:int 的实际大小是32bit,文中为了方便基本上使用16bit代替
一、java位运算中按位与 实例
public static void main(String[] args) {
sendMessage("","",7);
}
/**
* 发送信息的对外接口
* 发送短信flag : 1
* 发送邮件flag : 2
* 发送微信flag : 4
* 同时发送多种 flag : 和(发送短信和邮件就是3)
*/
private static final int SMS = 1;
private static final int MAIL = 2;
private static final int WECHAT = 4;
public static void sendMessage(String title,String content,int flag){
if((flag & SMS) == 1){
System.out.println("调用发送短信接口");
}
if((flag & MAIL) == 2){
System.out.println("调用发送邮件接口");
}
if((flag & WECHAT) == 4){
System.out.println("调用发送微信接口");
}
}
这个方法是比较简单的,使用java的安位与运算能够使逻辑更简洁和明朗。
二、java位运算
1.按位与 &
描述:两位全是1,结果才为1: 0&0=0; 0&1=0; 1&0=0; 1&1=1;
用途:
①清零:把一个数变为0,只要和0进行与运算。50&0=0;
②取一个数中制定位置:想取哪位,哪位置为1,其余为0;
设 x = 1010 1110 想要取得x的低4位
1010 1110
& 0000
1111
————————————————————
0000 1110
2.按位或 |
描述:只要有一个为1,结果就为1: 0|0=0; 0|1=1; 1|0=1; 1|1=1;
用途:
对一个数的某一位 置1:想要把哪位置1,哪位就是1,其余是0;
设 x = 1010 0000 低4位置1
1010 0000
| 0000 1111
————————————————————
1010 1111
3.按位异或 ^
描述:两个位的值为“异”(值不同),该位结果为1,值相同为0
0^0=0; 0^1=1; 1^0=1; 1^1=0;
用途:
①使特定位翻转:想要翻转的位为1,其余为0;
设 x = 1010 1110 低4翻转
1010 1110
^ 0000 1111
————————————————————
1010 0001
②与0异或保留原值
设 x = 1010 1110 保留原值
1010 1110
^ 0000 0000
————————————————————
1010 1110
③两个值进行交换:比较高效的方法
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
4.取反运算 ~
~1 = 0; ~0 = 1;
5.左移运算 <<
描述:将一个运算对象的各二进制位全部左移若干位(左边二进制丢弃,右边补0)
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
2<<1=4;
0000 0010 左移1位 0000 0100 为4; => 2*2=4;
6.右移运算 >>
描述:将一个运算对象的各二进制位全部右移若干位(
正数左补0,负数左补1,右边丢弃)
每右移一位,相当于该数除以2;
4>>2=1;
0000 0100 右移两位 0000 0001 为1; => 4/2/2=1;
7.无符号右移运算 >>>
描述:各个位向右移制定位数(左边补0,右边丢弃)
8.负数移位举例
负数是以其正值的补码形式来表示的
原码:一个正数按照绝对值大小转化成的二进制数称为原码
14原码: 0000 0000 0000 0000 0000 0000 0000 1110
反码:将原码按位取反,所得二进制称为原二进制的反码
14反码: 1111 1111 1111 1111 1111 1111 1111 0001
补码:反码加1称为补码
14补码: 1111 1111 1111 1111 1111 1111 1111 0010 =>即-14的二进制表示
求-14<<2
1111 1111 1111 1111 1111 1111 1111 0010 左移两位,右边补0
1111 1111 1111 1111 1111 1111 1100 1000 然后这个二进制的十进制是多少呢?肯定是一个负数,所以需要按照上面顺序反向求出该二进制的十进制。
先减一:
1111 1111 1111 1111 1111 1111 1100 0111
取反:
0000 0000 0000 0000 0000 0000 0011 1000 =>56
所以 -14<<2 = -56;
以上是负数的取反的分析过程。
从网上找到一个位运算的口诀:
清零取数要用与,某位置一可用或
若要取反和交换,轻轻松松用异或
三、java进制转换
1.进制转换API
//十进制到十六进制
Integer.toHexString(int i);
//十进制到八进制
Integer.toOctalString(int i);
//十进制到二进制
Integer.toBinaryString(int i);
//十六进制到十进制
Integer.parseInt("0xff", 16);
//八进制到十进制
Integer.parseInt("0123", 8);
//二进制到十进制
Integer.parseInt("1010", 2);
2.Java基本数据类型
byte : 8bit;
short : 16bit;
int : 32bit;
long : 64bit;
float : 32bit;
double : 64bit;
char : unicode字符16bit;
3.java数据类型转换为字节的底层实现原理([color=red]就是使用位运算哦)[/color]
例:8143(00000000 00000000 00011111 11001111)转化为字节数组为:
byte[] b = [-49,31,0,0]
实现:
①低8位:
8143>>0*8 & 0xff; 8143右移0位 和十六进制0xff进行 & 运算。
0xff:11111111 功能就是屏蔽掉前面24位取得最后8位。
结果为:11001111 十进制:207 或者 -49;
②第二低8位:
8143 >> 1*8 & 0xff; 8143右移1位 和十六进制0xff进行 & 运算。
向右移8位,然后与运算屏蔽前面24位取得第二8位。
结果为:00011111 十进制:31;
③第三低8位:
8143 >> 2*8 & 0xff; 8143右移2位 和十六进制0xff进行 & 运算。
结果为0;
③第四低8位:
8143 >> 3*8 & 0xff; 8143右移3位 和十六进制0xff进行 & 运算。
结果为0;
综上,每次进行移位取特定的8位,转化成相应的字节数组,以上的方式是采用小端表示法。
4.javaIO的源码中位运算
java源码中与上面例子十分相似的有一个IO流的writeInt方法。
DataOutputStream中的writeInt()方法:
public final void writeInt(int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(4);
}
java底层的实现很多都用到了位运算,所以掌握好了还是可以帮助查看源码的。
5.大小端
上面举例是采用小端的方式来输出字节数组的。
小端(Little-Endian):低位字节排放到内存的低地址端即该值的起始地址,高位字节排放到内存的高地址端。
大端(Big-Endian):高位字节排放到内存的低地址端即该值的起始地址,低位字节排放到内存的高地址端。
byte b = [-49,31,0,0]
小端
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | -49 | 31 | 0 | 0 |
大端
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0 | 0 | 31 | -49 |
先这些吧,累屎,不过每次自己码完博客,对待问题都会有更新的认识,明天继续JAVA IO流。
分享到:
相关推荐
通过“java_sunjing-master”这个项目,你可能会找到一些具体的Java运算实例,比如如何使用这些运算符解决实际问题,或者通过练习加深对运算规则的理解。记得动手实践,因为编程学习的关键在于不断地编写和调试代码...
《徐明浩java编程基础应用与实例代码》是针对初学者和有一定经验的Java程序员的一份宝贵资源,它深入浅出地介绍了Java编程的基础概念和实际应用。通过徐明浩先生的专业指导,读者可以系统性地掌握Java语言的核心要素...
"java基础代码实例_1"这个压缩包文件显然是一份专门为初学者准备的Java学习资源,旨在帮助他们快速掌握Java编程的基础。 首先,Java基础代码实例是学习过程中的关键部分。通过编写和运行实际的代码,学习者可以更好...
Java位运算是一种底层操作,它直接作用于二进制位,是计算机科学中的基础操作。在Java编程中,位运算可以用于高效地处理数据,尤其是在处理数组、位集或者进行低级优化时非常有用。本篇文章将深入探讨Java中的位运算...
Java位运算在编程中是一种非常基础且强大的操作,它直接作用于二进制位,能够进行高效的数值处理和数据操作。本文将深入讲解Java中的位运算,并通过雪花算法的应用实例来进一步阐述其重要性和用法。 1. **位运算...
从本章起,我们就正在进入Java基础知识的学习。就像人与人之间交流使用的语言需要遵循一定的语法规则一样,Java语言也离不开特定语法的支持,如基本语法、数据类型、变量、常量、运算符与表达式、类型转换和输入输出...
在Java编程语言中,位运算和逻辑运算都用于处理布尔值和整数,但它们在实际操作和行为上有着显著的差异。理解这些差异对于优化代码和深入理解计算机底层工作原理至关重要。 首先,我们来看看逻辑运算符。逻辑运算符...
以下是对给定文件中提到的一些位运算实例的详细解释: 1. **循环左移和循环右移**: - 左移运算符`将数字的二进制位向左移动指定的位数,右边空出的位用0填充。 - 右移运算符`>>`将数字的二进制位向右移动指定的...
3.6.3 String型对象与基本数据类型间的运算 25 3.7 运算符 25 3.7.1 逻辑非(!) 26 3.7.2 位非运算符(~) 26 3.7.3 符号运算符(+、-) 27 3.7.4 增减运算符(++、--) 27 3.7.5 算术运算符(+、-、*、/) 29...
"JAVA基础实例200题"很显然是一份针对初学者或希望巩固Java基础知识的学习资料,它包含了200个不同的练习题目,旨在帮助学习者通过实践来理解和掌握Java的基础概念。 在Java的学习过程中,基础是非常关键的部分,它...
这个"Java运算基础.zip"文件很可能包含了关于Java运算符的详细解释和实例,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及特殊运算符如三元运算符等。 1. **算术运算符**:在Java中,基本的...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
本话题聚焦于“Java应用程序和Java Web调用Matlab配置实例”,这是一个关于跨平台编程的重要实践,旨在利用Java的强大功能和Matlab的高级数学计算能力。Matlab是一款强大的数值计算和数据可视化工具,而Java作为一门...
实例015 加密可以这样简单(位运算) 20 实例016 用三元运算符判断奇数和偶数 21 实例017 不用乘法运算符实现2×16 22 实例018 实现两个变量的互换 (不借助第3个变量) 23 第4章 流程控制 25 实例019 判断某一年...
Java实现大数运算的实例代码 Java实现大数运算的实例代码主要介绍了Java实现大数运算的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。下面将对Java实现大数运算的实例代码进行详细的讲解。 一、...
在深入探讨"JAVA 2应用编程实例"这个主题之前,我们先来理解一下Java 2,也就是Java 2平台标准版(Java 2 Platform Standard Edition,J2SE)。它是Java技术的核心部分,提供了构建和运行桌面应用、服务器应用以及...
在“Java编程五大经典实例(初学者版)”中,作者旨在通过一系列基础且实用的编程案例,帮助初学者掌握Java编程的核心概念与技巧。实验的目标包括理解并运用Java的基本数据类型、运算符、表达式、数组和字符串;熟悉...
书中深入浅出地讲解了Java的基础知识,包括语法、数据类型、控制结构、类与对象、异常处理、输入/输出(I/O)、多线程、集合框架等核心概念。每章的实例练习旨在让读者通过实践来巩固理论知识,提升编程技能。 1. **...
以上五个实例覆盖了基础的输入输出、数据类型、循环、条件判断、数组操作、字符串处理、随机数生成、数学运算等Java编程的核心概念,对于初学者来说是很好的学习材料。同时,它们也展示了Java在处理不同类型问题时的...
java调用Gmssl中国密接口进行对称与非对称加解密等运算,动态so库进行接口jni方式调用,采取接口形式对外暴露,方便对接系统调用相关java接口进行相关运算操作。