Java 基本数据类型 && 位运算
1. Java基本数据类型
1.1 数据类型示意图
| 类型 | 字节数 | 范围 |
| byte | 1 | -128~127 |
| short | 2 | -32768~32767 |
| int | 4 |
-231~231-1 |
| long | 8 | -263~263-1 |
| float | 4 | |
| double | 8 | |
| bolean | 1 | |
| char | 2 |
(ps: byte、char、short在运算时会自动提升到 int 类型)
1.2 隐式转换&显式转换

隐式类型转换:从存储范围小的类型到存储范围大的类型转换。
显示类型转换:强制类型转换,从存储范围大的类型到存储范围小的类型转换。
2. 位运算
2.1 位运算符
| 运算符 | 说明 |
| & | 与 |
| | | 或 |
| ^ | 异或 |
| ~ | 取反 |
| << | 左移 |
| >> | 右移 |
| >>> | 无符号右移 |
【&&与&的区别】
&&存在短路,&通过位运算完成,无短路操作
2.2 原码、反码、补码
【原码】
符号位加上数字的二进制表示,第一位为符号位(0为正数,1为负数)
byte 类型的 +7 和 -7 的原码如下
+7:00000111
-7: 10000111
【反码】
正数的反码与原码相同,负数的反码符号位不变,其余位数取反。
byte 类型的 +7 和 -7 的反码如下
+7:00000111
-7: 11111000
【补码】
正数的原码、反码、补码相同,负数的反码为原码取反加1
byte 类型的 +7 和 -7 的补码如下
+7:00000111
-7: 11111001
2.3 把 long 数据转换成字节数组相互转换
/**
* 1. 把long数据转换成字节数组
* 2. 把字节数组数据转换成long
*/
public class TransDataType {
//把long数据转换成字节数组
public static byte[] long2Bytes(long lon) {
byte[] bytes = new byte[8];
for (int i = 0; i < 8; i++) {
bytes[i] = (byte) (lon >> (56 - 8 * i));
}
return bytes;
} //把字节数组数据转换成long
public static long bytes2Long(byte[] bytes) {
long val = 0;
for (int i = 0; i < 8; i++) {
long lon = ((long) bytes[i] & 0xff) << (56 - 8 * i);
val += lon;
}
return val;
} public static void main(String[] args) {
byte[] bytes = long2Bytes(-1275555);
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
} System.out.println("=============================================="); long l = bytes2Long(bytes);
System.out.println(l);
}
}
2.4 将 byte 变换成无符号的整数(0 ~ 255 , 正数不变)
/**
* 将byte变换成无符号的整数(0 ~ 255 , 正数不变)
*/
public class TransByte2Int {
public static int bytes2Int(byte by){
int a = by&0xff;
return a;
} public static void main(String[] args) {
int i = bytes2Int((byte) -128);
System.out.println(i);
}
}
2.5 定义函数,取出整数内存中的存储形态对应的16进制字符串与2进制字符串
/**
* 定义函数,取出整数内存中的存储形态对应的16进制字符串
* 定义函数,取出整数内存中的存储形态对应的2进制字符串
*/
public class TransInt2String {
//定义函数,取出整数内存中的存储形态对应的16进制字符串
public static String int2HexString(int in) { StringBuilder builder = new StringBuilder();
char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
for (int i = 0; i < 8; i++) {
char c = chars[in >> (i * 4) & 0x0f];
builder.insert(0, c);
}
return builder.toString();
} //定义函数,取出整数内存中的存储形态对应的2进制字符串
public static String int2BinString(int in) { StringBuilder builder = new StringBuilder();
char[] chars = {'0', '1'};
byte[] bytes = new byte[8];
for (int i = 0; i < 32; i++) {
builder.append(chars[in >> (31 - i) & 0x01]);
}
return builder.toString();
} public static void main(String[] args) { System.out.println("==============================================");
String s1 = int2HexString(100);
System.out.println(s1); System.out.println("==============================================");
String s2 = int2BinString(100);
System.out.println(s2);
}
}
2.6 有5亿整数(非负),去重计算不同整数的个数,300M内存
package com.share.java.test; import org.junit.Test; /**
* 有5亿整数(非负),去重计算不同整数的个数,300M内存
* int的最大值为Integer.MAX_VALUE (2147483647/8/1024/1024=255)
* 一个byte有8位,定义长度为 Integer.MAX_VALUE/8 +1 的byte数组
* 每一位都表示一个数
* 遍历int数组
* 通过 整数/8 确定行,用过 整数%8 确定列
* 通过得到的行数和列数确定的位置,判断该位置是否存在1
* 若不存在,将该位置设置为1,count加1
*/
public class TestCalc { @Test
public void testCountUnique() {
int[] arr = {0, 1, 2, 3, 4, 1, 2, Integer.MAX_VALUE};
System.out.println(countUnique(arr));
} /**
* 去重统计整数个数
*/
public static int countUnique(int[] arr) {
//计算行数
int rows = Integer.MAX_VALUE / 8 + 1; //初始化字节数组
byte[] bytes = new byte[rows]; //计数器
int count = 0;
//
for (int i : arr) {
//定位行数
int row = i / 8;
//定位列数
int col = i % 8;
//
int r = (byte) (bytes[row] & (1 << col));
if (r == 0) {
count++;
bytes[row] = (byte) (bytes[row] | (1 << col));
}
}
return count;
}
}
Java 基本数据类型 && 位运算的更多相关文章
- Java二进制和位运算,这一万字准能喂饱你
基础不牢,地动山摇.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托 ...
- Java中的位运算
昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~ 按位非(NOT)(一元运算) ...
- Java学习之位运算和逻辑运算符
今天看了一下HashMap类的源码,在HashMap的源码中定义了初始空间的大小 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 当 ...
- java基础之位运算
java中常见的位运算符:&(逻辑与) |(逻辑或) ~(取反) ^(逻辑异或) >>(右移) <<(左移) >>>(无符号右移) &(逻辑与 ...
- java ----> 基础之位运算
package test.ant; import java.util.Arrays; import java.io.UnsupportedEncodingException; public class ...
- Java中的位运算及简单的算法应用介绍
众所周知,计算机底层是二进制.而java作为一门计算机编程语言,也对二进制的位运算提供了完整的支持. 在java中,int是32位的,也就是说可以用来实现32位的位运算.方便起见,我们一般用16进制对 ...
- java中通过位运算实现多个状态的判断
通过 << | & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标 ...
- Java - day002 - 运算符,位运算,流程控制
1 运算符 +-*/ (+) 既是数学运算 ,也是 字符串链接 % 求余 / 求模 (进口大麻袋) == ...
- Java负数的位运算
/** * 求负数的位运算 *///1. -10 >> 2 = ?//2. -10的原码: 1000 0000 0000 0000 0000 0000 0000 1010 最高位代表符号位 ...
随机推荐
- Jackson xml json
public class XMLTest { private static XmlMapper xmlMapper = new XmlMapper(); private static ObjectMa ...
- Xcode中的Vim--XVim
相信大家在开始使用一门编程语言的时候,最先做的事就是去学习它对应的IDE.在你稍微进阶的时候,就会想着去学习IDE中的各种快捷键,比如 如何删除整行 如何在不使用鼠标的情况下,在代码间快速移动.跳转 ...
- JAVA WEB 三器之过滤器(Filter)
过滤器(Filter) 1. 简介 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,它是 Servlet 技术中最实用的技术,属于系统级别,主要是利用函数的回调实现.对 Jsp, ...
- Netty 源码阅读的思考------耗时业务到底该如何处理
目录大纲: 前言 处理耗时业务的第一种方式-------handler 种加入线程池 处理耗时业务的第二种方式-------Context 中添加线程池 总结:两种方式的对比和思考 前言 熟悉 Net ...
- Excel上传并读取数据
最近一段时间,维护一个旧系统,其中有一个功能,是把Excel上传,并读取数据进行维护,然后转插入至SQL数据库中.下面Insus.NET使用asp.net 标准上传控件: <asp:FileUp ...
- php一些单选、复选框的默认选择方法(示例)
转载 http://www.php.cn/php-weizijiaocheng-360029.html 一. radio和checkbox及php select默认选择的实现代码 1.radio单选框 ...
- 【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
- 【Tomcat】部署Web到tomcat的四种方式
一.静态部署 1.直接将web项目文件件拷贝到webapps 目录中 Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.所以可以将JSP ...
- 撩课-Web大前端每天5道面试题-Day32
1.module.export.import是什么,有什么作用? module.export.import是ES6用来统一前端模块化方案的设计思路和实现方案. export.import的出现统一了前 ...
- Android-Binder机制
http://www.jianshu.com/p/af2993526daf https://www.jianshu.com/u/e347b97e2f0c 上面这篇文章讲得很清楚.以下我的一些理解: 还 ...