广告
返回顶部
首页 > 资讯 > 精选 >Java的位运算实例代码分析
  • 105
分享到

Java的位运算实例代码分析

2023-07-06 00:07:08 105人浏览 八月长安
摘要

今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。位运算很久以前学习过位运算,

今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

位运算

很久以前学习过位运算,但是很久不用,感觉都忘得差不多了。最近看了几处位运算的代码,发现都看不懂了,哈。也是时候回来补一补基础知识了。

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。

位运算的运算符:

运算符含义
&按位与
|按位或
~按位取反
^按位异或
<<左移
>>带符号右移
>>>无符号右移

这些算是很基础的知识了,但是太久不用,还是难免会遗忘了,在编码的同时,可以多多使用!

Talk is cheap, show me the code.

说明:单独讨论这些确实是很难看到应用的地方,如果有不太清楚的可以去看看其他人的总结

我们以一个代码来看看位运算的应用:

public final void writeInt(int v) throws ioException {  out.write((v >>> 24) & 0xFF);  out.write((v >>> 16) & 0xFF);  out.write((v >>>  8) & 0xFF);  out.write((v >>>  0) & 0xFF);  incCount(4);}

这段代码是 DataOutputStream 类中的一个方法,用于将一个 int 型的整数写入流中。这个方法的命名是很有意思的,它和 OutputStream 中的 public abstract void write(int b) throws IOException 这个方法是完全不同的。这个方法的参数似乎是表示它可以将一个 int 型整数写入流中,但是方法的功能不是靠猜测的,而是要看方法的描述。

public abstract void write(int b) throws IOException

api 中的介绍:

Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

它是将一个特定的字节写入流中,我们知道一个int型变量占32位,一个byte占8位,所以一个小于256(2^8)的int型整数和byte型整数的最后8位是相同的。

因此这个方法是写入一个int型变量的最低8位,而将剩下的24位忽略。使用这个方法的时候,要格外注意!

The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

所以,将一个int型的变量完整的写入流中,并不是一个很简单的问题。让我们再回到上面这端代码: 它是连续四次写入,每次写入一个字节的数据,这样一个int型的变量,就被变为4个字节写入流中了。

out.write((v >>> 24) & 0xFF); 这个方法就是上面的写入较低的8位数字,这个具体实现是相应的子类提供的。

我们来看看图解: 一个简单的与运算:可以看出运算的结果是保留了低8位,这个就是 (v>>>24) & 0xFF 运算的结果。

Java的位运算实例代码分析

那么如何获取高8位的值呢?这就要使用移位运算进行操作了:

Java的位运算实例代码分析

通过进行移位操作,就可以获取每8位的数据,然后再进行按位与 & 运算,就可以将一个int型整数完全的写入流中了。

代码演示

代码
package draGon;//   public final void writeInt(int v) throws IOException {//        out.write((v >>> 24) & 0xFF);//        out.write((v >>> 16) & 0xFF);//        out.write((v >>>  8) & 0xFF);//        out.write((v >>>  0) & 0xFF);//        incCount(4);//    }//上面这段代码是将一个32位整型,写入输出流。//并且是将32位整型分为4个部分,每次写入8位。//这是Java的特性。public class DataOutputStreamAnalysis {public static void main(String[] args) {DataOutputStreamAnalysis analysis = new DataOutputStreamAnalysis();analysis.analysis(65535);}public void analysis(int number) {int number1, number2, number3, number4;  //后面的数字表示是一个32位整型的第几个8位。number1 = (number >>> 24) & 0xFF;    number2 = (number >>> 16) & 0xFF;    number3 = (number >>> 8) & 0xFF;number4 = (number >>> 0) & 0xFF;System.out.println(this.fORMat(Integer.toBinaryString(number))+"  原始数据"); System.out.println(this.format(Integer.toBinaryString(number1))+"  原始数据第一个8位");System.out.println(this.format(Integer.toBinaryString(number2))+"  原始数据第二个8位");System.out.println(this.format(Integer.toBinaryString(number3))+"  原始数据第三个8位");System.out.println(this.format(Integer.toBinaryString(number4))+"  原始数据第四个8位");}public String format(String bstr) {int len = bstr.length();StringBuilder sb = new StringBuilder(35);for (int i = 0; i < 32-len; i++) {sb.append("0");}sb.append(bstr);sb.insert(8, " ");sb.insert(17, " ");sb.insert(26, " ");   //前面插入一个字符后,所有字符的索引都变了!return sb.toString();}}
结果

Java的位运算实例代码分析

说明: 这里没有考虑负数的情况,不过都是一样的,只是负数的表示相对麻烦一点而已。只要理解正数,负数也不是什么问题了。

位运算的应用

1.判断 int 型变量x是奇书还是偶数

将变量 x 和 1 进行按位与运算,如果结果为 0,则变量x为偶数,否则为奇数。

if (x & 1 ==0) System.out.println("x是偶数");if (x & 1 == 1)     System.out.println("x是奇数");

说明:这个还是很好理解的,因为偶数的最后移位一定是 0。(二进制表示)

2.取 int 型变量 x 的第 k 位 将变量 x 右移 k 位,再和1进行逻辑与运算,结果即为变量 x 第 k 位的二进制值。

表达式:x >> k & 1 (推荐加上括号,这样显得更加清晰明了。)

3.将 int 型变量 x 的第 k 位置 1 将 1 左移 k 位,再和变量 x 进行逻辑或运算,则将变量 x 的第 k 位置 1,其它位保持不变。

表达式:x = x | (1 << k)

4.将 int 型变量的第 k 位 清 0 将 1 左移 k 位再取反,将其结果再和变量 下进行逻辑运算,则将变量 x 的第 k 位清 0,其它位保持不变。

表达式位:x = x & ~(1 << k)

5.计算两个整数的平均值

表达式位:(x & y) + ((x ^ y) >> 1)

6.对于大于1 的整数 x,判断 x 是不是 2 的幂

if (x & (x-1) == 0)System.out.println("x是2的次幂");

7.将一个数乘以 2 的 n 次幂

表达式:x = x << n

例如:将 x 扩大 2 倍:x = x << 1

推荐使用位运算的原因:

位运算的速度是快于算术运算的,因为位运算需要的指令少,执行所需要的时间就少,会显得很快,但是只有在大量执行的情况下才能看出来位运算的优点。毕竟现在的计算机已经越来越快了。

以上就是“Java的位运算实例代码分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java的位运算实例代码分析

本文链接: https://www.lsjlt.com/news/356800.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java的位运算实例代码分析
    今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。位运算很久以前学习过位运算,...
    99+
    2023-07-06
  • Java位运算的示例分析
    这篇文章给大家分享的是有关Java位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和...
    99+
    2023-06-02
  • java使用布尔运算代替位运算的示例分析
    这篇文章将为大家详细讲解有关java使用布尔运算代替位运算的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。布尔运算代替位运算虽然位运算的速度远远高于算术运算,但是在条件判断时,使用位运算替代布尔运...
    99+
    2023-06-27
  • Python海象运算符实例代码分析
    本篇内容主要讲解“Python海象运算符实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python海象运算符实例代码分析”吧!在判断条件下允许操作。在一定程度上简化了代码,但降低了可...
    99+
    2023-07-04
  • bat批处理位运算实例代码
    发现很多新手对于批处理中set/a的位运算的概念有点模糊,我也是,什么“异、或、与、逻辑移位”,看的云里雾里,头脑发胀,于是就有了下面的代码。 @echo off if "%~1...
    99+
    2022-11-12
  • JavaScript运算符与表达式实例代码分析
    本篇内容主要讲解“JavaScript运算符与表达式实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript运算符与表达式实例代码分析”吧!一、===严格相等运算符,用作逻...
    99+
    2023-07-06
  • java代码实例分析
    这篇文章主要介绍“java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java代码实例分析”文章能帮助大家解决问题。一、几个坑爹代码的目录这样使用 StringBuffer 的方法有什...
    99+
    2023-06-16
  • Java实现大数运算的实例代码
    一、大数运算介绍大数运算,顾名思义,就是很大的数值的数进行一系列的运算。它是指由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。二、Java...
    99+
    2023-05-31
    java 大数运算 ava
  • shell中基本计算、逻辑运算、位运算的示例分析
    这篇文章给大家分享的是有关shell中基本计算、逻辑运算、位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3...
    99+
    2023-06-09
  • PHP算法题实例代码分析
    本篇内容主要讲解“PHP算法题实例代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP算法题实例代码分析”吧!题目给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 ...
    99+
    2023-07-05
  • PHP和Java代码实例分析
    这篇文章主要介绍“PHP和Java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP和Java代码实例分析”文章能帮助大家解决问题。命名案例1function getGood...
    99+
    2023-06-16
  • Java各种运算符应用实例分析
    这篇“Java各种运算符应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java各种运算符应用实例分析”文章吧。一...
    99+
    2023-06-30
  • Go语言运算符与控制结构实例代码分析
    这篇文章主要讲解了“Go语言运算符与控制结构实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言运算符与控制结构实例代码分析”吧!运算符运算符的作用是将操作数组合成表达式,比如...
    99+
    2023-07-05
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • Java代理模式实例代码分析
    今天小编给大家分享一下Java代理模式实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、动态代理模式动态代理的特...
    99+
    2023-06-29
  • Python除法运算和幂运算代码实例
    “//”运算除法运算符是“/”,这个人人皆知道,但是这个二元运算符“/”求出来的结果都是取决于操作数本身的20 / 3620 / 3.06.66666666666666720.0 / 36.66666666666666720.0 / 3...
    99+
    2023-01-31
    除法 实例 代码
  • Java实现四则混合运算代码示例
    使用栈来实现,可以处理运算优先级。使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2。无需把表达式先转换为逆波兰等形式。package com.joshua.cal; import java.util.Collections; ...
    99+
    2023-05-31
    java 四则运算 ava
  • python数值运算实例分析
    今天小编给大家分享一下python数值运算实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。说明对整数型和浮点型来说,由...
    99+
    2023-06-30
  • Java混合运算规则的示例分析
    这篇文章主要介绍了Java混合运算规则的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。重要规则://byte short char 做混...
    99+
    2023-05-31
    java
  • Java中BigDecimal基本运算的示例分析
    小编给大家分享一下Java中BigDecimal基本运算的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法:第一种:BigDecimal(doub...
    99+
    2023-05-30
    java bigdecimal
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作