位运算是比较接近机器语言的运算方式,虽然比较消耗脑力,但很高效,必要时加上几句位运算的代码,会使程序跑的更快,同时,它也是一些专门场景中非常重要的一部分。现在就让我一起来了解一下吧!


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 位运算基础相关推荐

  1. java游戏将相_(Java)算法——位运算基础及基本应用

    位运算基础及基本应用 在处理整形数值时,可以直接对组成整形数值的各个位进行操作.这意味着可以使用屏蔽技术获得整数中的各个位(??) 位运算是针对整数的二进制进行的位移操作 整数 32位 , 正数符号为 ...

  2. Java位运算的基础及使用(意义)

    Java位运算的基础及使用(意义) 前言 一.位运算基础 二.位运算应用 三.位运算试题 前言 这几天在看HashMap的源码,但里面的位运算太多,看得有点晕.故,先整理位运算相关知识. 在了解位运算 ...

  3. java取余位运算_Java位运算基础知识

    在学习Java运算时,补充学习Java位运算. Java位运算 位运算都是针对整数的补码进行位运算. & 按位与运算 先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下 ...

  4. Java位运算的实用场景

    Java位运算,基础知识从菜鸟教程上面学的 Java 运算符 | 菜鸟教程Java 运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们 ...

  5. 我们应该知道的java位运算

    最近又回去重新看了java基础的书籍,在记录总结以前一些比较容易混淆的知识点.下面是本篇要记录的内容 一. 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原码 ...

  6. Java位运算优化:位域、位图棋盘等

    快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...

  7. 小博老师解读经典Java面试题—Java位运算

    [面试原题] 我们经常会看到类似于下面这样的Java面试题: 请编写出效率最高的2乘以8的运算结果. [正确答案] 2<<3 [面试技术点] 面试者是否了解.灵活运用java位运算技术. ...

  8. Java位运算,常见的位运算

    前提 位运算符中 ,操作数只能为整型和字符型数据 运算符号 按位与(&):同1则1 → true&&true 操作数1 0 0 1 1 操作数2 0 1 0 1 按位与 0 0 ...

  9. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

最新文章

  1. OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式...
  2. 我的文档名字跟计算机名不一样,win10系统如何更改我的文档名称
  3. Linux下VTK、ITK的安装及运行 转载
  4. mysql查询系统年月_mysql每个月自动创建一张表,以年月做为表名,如何进行联合查询...
  5. 【Unity】关于屏幕自适应的思路
  6. 类数组变量定义与初始化
  7. 巨象指纹浏览器可以帮助用户做些什么?
  8. python中item是什么意思中文-python中的item
  9. 解决IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter
  10. 2017146期计算机开机号,[彩吧]福彩3D17147期开机号103
  11. C语言编程实现数兔子问题
  12. jQuery UI Datepicker 选择时分秒
  13. Yii Framework 开发教程(32) Zii组件-GridView示例
  14. SAP 新配置公司代码F-02记账时报错“通用日记账的分类账定制设置中存在不一致” 解决
  15. Android学习笔记三
  16. 用python处理excel之替换功能
  17. 选择一个手持式频谱分析仪 需要参考哪些条件
  18. 蓝牙路由器是怎么回事?
  19. python周环比增长率怎么算_平均增长速度可以根据各个环比增长速度直接求得。()...
  20. 我采访了 GPT-4:与人类相比,我并没有实际的语言运用和交际经验

热门文章

  1. r语言boxcox异方差_如何检测异方差并纠正它?
  2. 前端安全系列:如何防止CSRF攻击?
  3. 一键启动多应用(windows版)
  4. 小米一面、二面,面经
  5. java提取word中的图片
  6. OMG,12 个精致的 Java 字符串操作小技巧,学它
  7. hdu 2222 AC 自动机 模版(数组实现)
  8. xwiki功能-皮肤
  9. pr系统兼容性报告不支持视频驱动程序有什么影响?怎么解决?
  10. 最全的数据结构归纳总结