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 最高位代表符号位 ...
随机推荐
- springmvc json 406
spring 4.0 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...
- 使用netfilter_queue改包笔记
系统:centos 7 准备:安装libnetfilter_queue模块,可以yum安装,也可以网上下载rpm包安装 简介:使用iptables在NAT表上创建DNAT与SNAT规则,对数据包进行转 ...
- Eclipse 处理 Console 打印信息自动删除
开发中,特识是需要项目运行打印日志很长的时候需要查看打印的日志, Eclipse没经过设定的话,会自动80000行之前的日志记录. 想要日志一直打印下去处理方法: Preferences --> ...
- A Game(区间DP)
Little Hi and Little Ho are playing a game. There is an integer array in front of them. They take tu ...
- [转]csv文件导入Mysql
本文转自:https://blog.csdn.net/quiet_girl/article/details/71436108 本篇博客主要讲将csv文件导入Mysql的方法(使用命令行). Step1 ...
- [转]NodeBB 环境搭建
本文转自:https://my.oschina.net/pauli/blog/198405 摘要: Windows 7 下面 NodeBB (https://nodebb.org/)环境搭建 ...
- _ViewStart文件应用
在这篇<MVC母版页_Layout.cshtml>http://www.cnblogs.com/insus/p/3380419.html中,把一些已经存在的视图或是新产生的视图加入母版中. ...
- SQL SERVER存储过程中使用事务
存储过程格式: CREATE PROCEDURE YourProcedure AS BEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...
- winform窗体 小程序【登录窗体】【恶搞程序】
登录窗体 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; ...
- Book Contents Reviews Notes Errata Articles Talks Downloads Resources Code Formatter Cover of C# in Depth Order now (3rd edition) Implementing the Singleton Pattern in C#
原文链接地址: http://csharpindepth.com/Articles/General/Singleton.aspx#unsafe Implementing the Singleton P ...