Java移位运算

博客理由:景区APP项目中涉及到分布式ID设计。分别有几种ID的设计方式:一种是数据库的自增,但是局限很大;第二种uuid,直接采用jdk自带的uuid生成即可;第三种是Twitter的Snowflake(雪花)ID生成技术,目前还在研究公开的源码,但是其中涉及到的移位运算比较多,故写下此文章回顾移位运算。

Java中有三种移位运算:

num << 位数    :这种表示num向左移动多少位,一般会用长整型来描述这个num,例如(Snowflake中的时间戳取值范围)1L << 41,就代表1L毫秒左移41位。

num >> 位数    :num右移具体位数;

>>>    : 无符号右移,忽略符号位,空位都以0补齐。

先来看一段移位的Demo,然后我来说明一下如何理解Java的移位运算。

package com.b510.test;/*** @author * @create date:2017-11-17* @version 1.0*/
public class Test {public static void main(String[] args) {int number = 10;//原始数二进制printInfo(number);number = number << 1;//左移一位printInfo(number);number = number >> 1;//右移一位printInfo(number);}/*** 输出一个int的二进制数* @param num*/private static void printInfo(int num){System.out.println(Integer.toBinaryString(num));}
}
运算结果:

1010
10100
1010
这就是移位运算的过程,其实对于Java语言来说,移位运算运用的并不是很多,因此移位运算对于大多数初级开发者来说会感觉到很陌生、很神秘。

我们应当这么理解Java中的移位运算:首先移位运算是针对二进制数来说的,由于Java中的整型(int long)都是以十进制表示,因此我们应当明确一点,一个数可以有多种进制的表达形式,我们写的整型数也同样可以进行移位运算,当然,移位之后的值,就必须去用二进制的思维去考虑了。

一种常见的应用场景是二进制数的取值范围,Snowflake中时间戳用41位的二进制表示,那41位的二进制数可以表示多少个1毫秒呢?计算的方式就是1L << 41,其实这个运算可以拆分成两部分:第一部分1L,第二部分<<41,第一部分代表十进制的1(个)毫秒,第二部分左移41位,实际上在Java底层会将前面的1L转换成二进制数之后再进行移位运算,最后将结果以长整型的形式输出出来。

可以用十进制来类比一下,一个十进制的1左移3位是多少?没错,是1000,取值范围是1~999(一般计算的是整数的取值)。

这样我们就可以理解:为什么Snowflake的41位的时间戳可以用:(1L<< 41) / (1000L * 60 * 60 * 24 * 365) = 69年了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机的外部设备 硬盘,外部设备采用SMB协议想共享电脑硬盘下的文件

您好&#xff01;很抱歉这么晚回复您&#xff0c;请您尝试以下的步骤&#xff1a;1、右键点击”此电脑“&#xff0c;选择“管理”&#xff0c;展开“本地用户和组”&#xff0c;右键点击“Guest”&#xff0c;设置密码为空密码&#xff1b;取消帐户已禁用&#xff0c;点选“用…

史上最全的ubuntu服务器搭建环境教程~~~

ubuntu服务器搭建环境~~~ 1. 先安装xshell&#xff1a;远程服务器连接&#xff08;取代直接在浏览器 上 访问&#xff09; 2. 安装xftp&#xff08;ftp文件传输&#xff09;直接双击红色圈圈即可3. 安装mysql数据库&#xff1a;指令&#xff1a;sudo apt-get updatesudo apt-ge…

Apache工具包方法——Hex.encodeHexString(byte[] data)源码浅析

【2019-07-02 注&#xff1a;标题是Hex.encodeHexString(byte[] data) 的源码解析&#xff0c;但在实际测试过程中&#xff0c;改了方法名称&#xff0c;内部实现还是完全一样的。】 最近正在研究加密的相关方法和思想&#xff0c;有时候会用到byte类型的数组密钥或者密文&…

Spring Boot————简介与Spring时代的承接

引言 最近&#xff0c;公司正在开发一个景区系统的项目&#xff0c;涉及到Spring Boot框架的使用&#xff0c;在此记录下Spring Boot框架应该知道的基础知识。 一、产生 SpringBoot是顺应现在微服务&#xff08;MicroServices&#xff09;理念而产生的一个微框架&#xff08…

计算机考试400,400作文:电脑考试

400作文&#xff1a;电脑考试今天下午第三节课是大家最爱的电脑课&#xff0c;第三节课的上课铃还没敲响&#xff0c;大家就早早来到电脑室门口&#xff0c;拍好整齐的队伍&#xff0c;等待电脑金老师来带领我们进电脑室。终于&#xff0c;金老师面带微笑从办公室走到了我们这边…

史上最容易理解的暴力递归和动态规划~~

史上最容易理解的暴力递归和动态规划~~介绍递归和动态规划暴力递归&#xff1a;1&#xff0c; 把问题转化为规模缩小了的同类问题的子问题2&#xff0c; 有明确的不需要继续进行递归的条件(base case)3&#xff0c; 有当得到了子问题的结果之后的决策过程 4&#xff0c; 不记录…

英雄联盟与人生奋斗的类比讨论

自从去年毕业之后就已经很少玩英雄联盟了&#xff0c;最近半年更是一次都没碰过这个游戏了。 更新还是异常的频繁&#xff0c;打斗还是异常的激烈&#xff0c;比赛还是异常的水&#xff08;S系列中国队的表现&#xff09;。 我今天并不是想追忆曾经的激情&#xff0c;而是想把…

如何最好手机硬件测试软件,手机硬件出现故障?简单几部教你自己动手检测! _手机资讯...

很多人在使用手机时&#xff0c;经常遇到例如屏幕触摸不准、距离感应器不反应、手机按键失灵等类似问题&#xff0c;有的情况是系统故障&#xff0c;但大多数是属于硬件故障&#xff0c;那如何判定呢&#xff1f;其实很多安卓手机自带的有硬件检测工具&#xff0c;下面就以小米…

String StringBuilder StringBuffer三者之间的区别~~~

String StringBuilder StringBuffer三者之间的区别~~~String是字符串常量&#xff0c;它是典型的immutable类&#xff0c;被声明final class&#xff0c;所有的属性都是final&#xff0c;由于它的不变性&#xff0c;类似拼接&#xff0c;剪裁字符串等操作&#xff0c;都会产生…

qq传输文件的软件测试点,超强新功能 QQ传文件夹测试版抢先试用

QQ传文件夹测试版试用(1)中关村在线软件事业部消息 腾讯体验中心今日(7月29日)发布了一个新的体验项目“QQ2009传文件夹测试版”。QQ的传文件功能&#xff0c;相信多数用户都使用过。在之前的版本中&#xff0c;很多用户反馈希望增加传文件夹的功能&#xff0c;方便多文件的传输…

String String.valueof() toString三者之间的区别~

String String.valueof() toString三者之间的区别~&#xff08;String &#xff09;强制类型转换&#xff0c;使用这种方法时&#xff0c;需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查&#xff0c;以判断是否可以转换。否则容易抛出CalssCastExc…

SpringBoot学习——@Autowired自动注入报:could not be found问题的理解和解决方案

微服务应用程序中&#xff0c;我们会通过Java后台的方式发送http请求并调用其他注册在Spring Cloud Eureka server上的微服务&#xff0c;之前我们可能会手动封装一个Http发送请求类&#xff0c;然后通过其中的sendGet或者sendPost方法借由java IO的形式发送出去。 但是&#…

黑色玫瑰服务器延迟高,LOL:含金量最高的服务器,黑色玫瑰垫底,最后一个钻石起步!...

原标题&#xff1a;LOL&#xff1a;含金量最高的服务器&#xff0c;黑色玫瑰垫底&#xff0c;最后一个钻石起步&#xff01;黑色玫瑰。它是英雄联盟中非常特别的一个大区。这个大区是中间位置&#xff0c;电十&#xff0c;却是比电二高手还要多的地方。因为这个大区小姐姐特别的…

redis学习与入门~~~

redis学习与入门~~~ 一。 Redis 简介&#xff1a; 通常而言目前的数据库分类有几种&#xff0c;包括 SQL/NSQL,&#xff0c;关系数据库&#xff0c;键值数据库等等&#xff0c;分类的标准也不1&#xff0c;Redis本质上也是一种键值数据库的&#xff0c;但它在保持键值数据库简单…

Java网络编程————UDP实现ThinkPad S5网络唤醒

功能要求&#xff1a;通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识&#xff1a; 一、定义&#xff1a;网络唤醒&#xff0c;通过局域网、互联网或通讯网络&#xff0c;以有线网卡的形式&#xff0c;向目标电脑发送魔法包(Magic Packet)&#xff0c;让电脑自动开机。…

FFmpeg在Ubuntu的安装以及教程~~~

FFmpeg在Ubuntu的安装以及教程~~~一、安装 可通过PPA进行安装sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next sudo apt-get update sudo apt-get install ffmpeg 查看是否安装成功&#xff1a; ffmpeg -version二、相关概念比特率比特率&#xff0c;是一个决定音视…

Java学习指导————如何做到基础扎实

原文出处&#xff1a;《一篇文章教会你&#xff0c;如何做到招聘要求中的“要有扎实的Java基础”》 引言 不少同学总会产生这样的疑问&#xff1a; “请问&#xff0c;如何才叫基础扎实&#xff1f;” 答案是&#xff1a;“玩好JDK&#xff01;” JDK学习内容主要包含三部分…

奥特曼系列ol服务器名称带怪兽,《奥特曼系列ol》怪兽图鉴 怪兽阵容

《奥特曼系列ol》这款游戏中的怪兽图鉴也是很多玩家非常关注的问题之一哦&#xff0c;随着游戏的不断的更新&#xff0c;游戏也是加入了不少全新的玩法&#xff0c;一定让很多玩家觉得有些迷惑吧。下面小编为大家带来《奥特曼系列ol》怪兽图鉴以及怪兽阵容&#xff0c;希望大家…

继上一篇博客--javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

通过动态分配地址来提升javaweb文件下载接口的其兼容性和可扩展性&#xff1a; &#xff08;上篇博文地址&#xff1a;https://blog.csdn.net/weixin_37766296/article/details/80044000&#xff09;log4j.properties 文件&#xff1a; log4j.rootLogger debug,stdout,D,Elog4…

服务器主机启动不显示,服务器主机不启动怎么回事

服务器主机不启动怎么回事 内容精选换一换本文介绍了主机迁移服务SMS各特性版本的功能发布和对应的文档动态&#xff0c;新特性将在各个区域(Region)陆续发布&#xff0c;欢迎体验。源端服务器数据收集声明。源端服务器上安装和配置完迁移Agent后&#xff0c;迁移Agent会把源端…