Java 位运算基础
位运算是比较接近机器语言的运算方式,虽然比较消耗脑力,但很高效,必要时加上几句位运算的代码,会使程序跑的更快,同时,它也是一些专门场景中非常重要的一部分。现在就让我一起来了解一下吧!
1.位运算的表达式
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
~ | 按位取反 | << | 有符号数左移 |
& | 按位与 | >> | 有符号数右移 |
| | 按位或 | >>> | 无符号数右移 |
^ | 按位异或 |
2.运算符的优先级和结合性
优先级 | 运算 | 结合性 |
---|---|---|
1 | ()、[]、.、new | 自左向右 |
2 | ~、!、++、–、(类型名)、+(正号)、-(负号) | 自右向左 |
3 | *、/、% | 自左向右 |
4 | +、- | 自左向右 |
5 | <<、>>、>>> | 自左向右 |
6 | >、>=、<、<=、instanceof | 自左向右 |
7 | ==、!= | 自左向右 |
8 | & | 自左向右 |
9 | ^ | 自左向右 |
10 | | | 自左向右 |
11 | && | 自左向右 |
12 | || | 自左向右 |
13 | ?: | 自右向左 |
14 | =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=、>>>= | 自右向左 |
3.练习实例
针对位操作,这里提供一个对BMP格式图片的隐写练习。
原理:BMP图片是无损的,可针对色位最低位注入自己的数据,而图片显示不出明显的改动痕迹[实际是有的]。代码详情:https://gitee.com/kxwinxp/secretbmp
注意:代码是针对24位BMP图片进行处理,兼容32位,但不支持低于24位
主体代码:
/*** 方法体入口* InjectBmp(fileBmp,fileSecret)--->注入隐藏数据* SuckBmp(fileBmpou,fileRecovery)--->读出隐藏数据* @param args*/public static void main(String[] args) {File fileBmp = new File("src/main/resources/origin.bmp");File fileSecret = new File("src/main/resources/origin.txt");//编译后路径//URL resource = Class.class.getClass().getResource("/origin.bmp");File fileBmpou=new File("src/main/resources/secret.bmp");File fileRecovery=new File("src/main/resources/secret.txt");try {//注入方法调用new testMain().InjectBmp(fileBmp,fileSecret);//提取方法调用byte[] result = new testMain().SuckBmp(fileBmpou,fileRecovery);System.out.println(new String(result, "UTF-8"));} catch (Exception e) {e.printStackTrace();}}/*** 将文本信息从BMP图片取出** @param fileBmp 存有隐藏数据的BMP图片路径* @param fileSecret 取出数据到 [可空]* @return 取出数据Bytes* @throws Exception*/public byte[] SuckBmp(File fileBmp, File fileSecret) throws Exception {FileOutputStream ou = null;if (fileSecret != null) {if (fileSecret.exists()) {fileSecret.delete();}ou = new FileOutputStream(fileSecret);}BufferedImage bi = ImageIO.read(fileBmp);int width = bi.getWidth();int height = bi.getHeight();System.out.println("bmp:" + width + "*" + height + "=" + (width * height));//读取文件大小信息byte[] tranRead = BmpUtil.read(bi, new Position(), 8);long total = ByteUtil.getLong(tranRead, 0);//除去文件大小信息(8字节)的起点Position position = new Position((22) % bi.getWidth(), 22 / bi.getWidth(), 1);int len = 1024;System.out.println(total);byte[] allbt = null;while ((total - 1) / len > 1 || (len = (int) total) > 0) {total -= len;byte[] tranRead2 = BmpUtil.read(bi, position, len);allbt = (allbt == null) ? tranRead2 : ByteUtil.addBytes(allbt, tranRead2);if (ou != null) {ou.write(tranRead2);ou.flush();}}if (ou != null) {ou.close();}return allbt;}/*** 将文本信息注入BMP图片* 原理:图片一个像素[3原色(RGB),即3字节]可分离出3位,8像素可分离3字节** @param fileBmp 要存隐藏数据的BMP图片路径* @param fileSecret 要存的隐藏数据路径* @throws Exception*/public void InjectBmp(File fileBmp, File fileSecret) throws Exception {FileInputStream in = new FileInputStream(fileSecret);BufferedImage bi = ImageIO.read(fileBmp);int inSize = 1024;byte[] inbt = new byte[inSize];//8个字节所占像素约为22int pixel=8*8/3+(8*8%3==0?0:1);Position position = new Position(pixel % bi.getWidth(), pixel / bi.getWidth(), 1);long len = 0;while ((inSize = in.read(inbt)) != -1) {len += inSize;//每次注入inSize=1024个字节,并返回下一个像素位置[具体到3原色]position = BmpUtil.inject(bi, position, inbt, inSize);}// 将文本大小信息保存在图片头部(8字节[充当long类型]约占22个像素)byte[] end = new byte[8];ByteUtil.putLong(end, len, 0);System.out.println("total:" + len + " px" + position.x + ",py" + position.y);BmpUtil.inject(bi, new Position(), end, 8);String format = "bmp";File fileout = new File(fileBmp.getAbsolutePath().substring(0, fileBmp.getAbsolutePath().lastIndexOf(File.separator)), "secret." + format);ImageIO.write(bi, format, fileout);}
Java 位运算基础相关推荐
- java游戏将相_(Java)算法——位运算基础及基本应用
位运算基础及基本应用 在处理整形数值时,可以直接对组成整形数值的各个位进行操作.这意味着可以使用屏蔽技术获得整数中的各个位(??) 位运算是针对整数的二进制进行的位移操作 整数 32位 , 正数符号为 ...
- Java位运算的基础及使用(意义)
Java位运算的基础及使用(意义) 前言 一.位运算基础 二.位运算应用 三.位运算试题 前言 这几天在看HashMap的源码,但里面的位运算太多,看得有点晕.故,先整理位运算相关知识. 在了解位运算 ...
- java取余位运算_Java位运算基础知识
在学习Java运算时,补充学习Java位运算. Java位运算 位运算都是针对整数的补码进行位运算. & 按位与运算 先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下 ...
- Java位运算的实用场景
Java位运算,基础知识从菜鸟教程上面学的 Java 运算符 | 菜鸟教程Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们 ...
- 我们应该知道的java位运算
最近又回去重新看了java基础的书籍,在记录总结以前一些比较容易混淆的知识点.下面是本篇要记录的内容 一. 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原码 ...
- Java位运算优化:位域、位图棋盘等
快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...
- 小博老师解读经典Java面试题—Java位运算
[面试原题] 我们经常会看到类似于下面这样的Java面试题: 请编写出效率最高的2乘以8的运算结果. [正确答案] 2<<3 [面试技术点] 面试者是否了解.灵活运用java位运算技术. ...
- Java位运算,常见的位运算
前提 位运算符中 ,操作数只能为整型和字符型数据 运算符号 按位与(&):同1则1 → true&&true 操作数1 0 0 1 1 操作数2 0 1 0 1 按位与 0 0 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
最新文章
- OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式...
- 我的文档名字跟计算机名不一样,win10系统如何更改我的文档名称
- Linux下VTK、ITK的安装及运行 转载
- mysql查询系统年月_mysql每个月自动创建一张表,以年月做为表名,如何进行联合查询...
- 【Unity】关于屏幕自适应的思路
- 类数组变量定义与初始化
- 巨象指纹浏览器可以帮助用户做些什么?
- python中item是什么意思中文-python中的item
- 解决IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter
- 2017146期计算机开机号,[彩吧]福彩3D17147期开机号103
- C语言编程实现数兔子问题
- jQuery UI Datepicker 选择时分秒
- Yii Framework 开发教程(32) Zii组件-GridView示例
- SAP 新配置公司代码F-02记账时报错“通用日记账的分类账定制设置中存在不一致” 解决
- Android学习笔记三
- 用python处理excel之替换功能
- 选择一个手持式频谱分析仪 需要参考哪些条件
- 蓝牙路由器是怎么回事?
- python周环比增长率怎么算_平均增长速度可以根据各个环比增长速度直接求得。()...
- 我采访了 GPT-4:与人类相比,我并没有实际的语言运用和交际经验