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 最高位代表符号位 ...
随机推荐
- 【一个小功能】点击图标/链接发起QQ临时会话
有时候,我们需要实现在网页上点击一个QQ图标来实现QQ临时会话,这样不用添加好友,也能满足及时沟通的需求. 实现方案比较简单,只是为a标签修改href属性,代码如下 <a href=" ...
- Java集合类源码解析:HashMap (基于JDK1.8)
目录 前言 HashMap的数据结构 深入源码 两个参数 成员变量 四个构造方法 插入数据的方法:put() 哈希函数:hash() 动态扩容:resize() 节点树化.红黑树的拆分 节点树化 红黑 ...
- LINQ to Objects系列(2)两种查询语法介绍
LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查 ...
- LINQ to Objects系列(1)相关技术准备
LINQ to Objects是LINQ的一部分,是查询对象集合的一种语法.首先看一下LINQ的体系结构,这样对LINQ有一个大致的了解.如图. 第一篇文章主要是回顾一下学习LINQ to Objec ...
- Calendar类的一些不易区分的属性
1.Calendar.MONTH 月份从0-11,获取之后需要加1才能得到真正的月份 2.Calendar.DAY_OF_WEEK 本周的第几天,从星期天开始算 3.Calendar.WEEK_OF_ ...
- Hadoop集群动态服役新的数据节点&&退役数据节点
备注:新添的机器为hadoop05,现有hadoop01.hadoop02.hadoop03.hadoop04 环境准备: 1.先克隆一台和集群中一样的机器 2.修改机器ip和主机名称 3.删除原来的 ...
- 【Mybatis】XML配置实现增删改查
①创建数据库和表,数据库为mytest,表为users CREATE DATABASE mytest; USE mytest; DROP TABLE IF EXISTS users; CREATE T ...
- 记一次Full GC问题的排查
今天看到监控平台显示项目的Full GC次数过多,查看了一下监控曲线,如下图,发现发生的时间点基本上都是在上午十点之后,到下午五点. 分析:考虑到业务形态,开始初步怀疑是访问人数增多引起的虚拟机内存不 ...
- python匿名函数lambda与switch的实现
1,lambda的语法跟es6的箭头函数差不多 >>> show=lambda x,y: x * y >>> show( 10, 20 ) 200 2,递归求阶乘 ...
- Codeforces343D(SummerTrainingDay06-F dfs序+线段树)
D. Water Tree time limit per test:4 seconds memory limit per test:256 megabytes input:standard input ...