返回顶部
首页 > 资讯 > 精选 >Java位运算的示例分析
  • 438
分享到

Java位运算的示例分析

2023-06-02 18:06:46 438人浏览 八月长安
摘要

这篇文章给大家分享的是有关Java位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和

这篇文章给大家分享的是有关Java位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。

1)左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。2)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。 “有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。3)Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或c++没有的。4)若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。 只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。 若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。 但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。 它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

在进行位运算时,需要注意几点:

(1)>>>和>>的区别是:在执行运算时,>>>运算符的操作数高位补0,而>>运算符的操作数高位移入原来高位的值。(2)右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。(3)若进行位逻辑运算的两个操作数的数据长度不相同,则返回值应该是数据长度较长的数据类型。(4)按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。(5)按位与运算可以用来屏蔽特定的位,也可以用来取某个数型数中某些特定的位。(6)按位或运算可以用来对某个整型数的特定位的值置1。

位运算符的优先级

~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。

位运算的应用

判断int型变量a是奇数还是偶数

a&1 == 0 偶数a&1 == 1 奇数

求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围。

  (x&y)+((x^y)>>1);
知识点:>>n 相当于除于2^n ,<<n 相当于乘于2^n 。x,y对应位均为1,相加后再除以2还是原来的数,如两个00001000相加后除以2仍得00001000,那么我们把x与y分别分成两个部分来看,两者相同的位分别拿出来 则 :x = (111111111111000)2 =  (111111111111000)2 +  (000000000000000)2y =  (111111111111010)2 =  (111111111111000)2 +  (000000000000010)2相同部分我们叫做x1,y1,不同部分我们叫做x2,y2.那么现在(x+y)/2 =(x1+y1)/2 +(x2 + y2)/2 ,因为x1 == y1 ,所以(x1+y1)/2 ==x1 ==y1,相同部分我们用与运算求出来 x1 = x&y ,不同部分的和我们用^求出来,然后除于2就是我们想要的结果了。

对于一个大于0的整数,判断它是不是2的几次方

((x&(x-1))==0)&&(x!=0);    

比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法

x ^= y;    y ^= x;    x ^= y;

求绝对值

int abs( int x ) {         int y ;         y = x >> 31 ;        return (x^y)-y ;        //or: (x+y)^y   }

取模运算,采用位运算实现

 a % (2^n) 等价于 a & (2^n - 1) ;或者 m % n 等价于 m & (n-1)

乘法运算 采用位运算实现

 a * (2^n) 等价于 a << n

除法运算转化成位运算

  a / (2^n) 等价于 a>> n

求相反数

  (~x+1)

a % 2 等价于

   a & 1

取int型变量a的第k位 (k=0,1,2……sizeof(int))

  a>>k&1   (先右移再与1)

将int型变量a的第k位清0

  a&~(1<<k)    (10000 取反后为00001 )

将int型变量a的第k位置1

  a|(1<<k)

int型变量循环左移k次

  a<<k|a>>16-k   (设sizeof(int)=16)

int型变量a循环右移k次

  a>>k|a<<16-k   (设sizeof(int)=16)

对于一个数 x >= 0,判断是不是2的幂。

boolean isPower2(int x) {        return ((x&(x-1))==0) && (x!=0);    }

不用temp交换两个整数

void swap(int x , int y) {        x ^= y;        y ^= x;        x ^= y;    }

条件判断赋值简写

if (x == a)        x= b;   else        x= a;  等价于 x= a ^ b ^ x;

x的相反数

  (~x+1)

m乘以2的n次方

  m << n

m除以以2的n次方

  m >> n

求整数k从x位(高)到y位(低)间共有多少个1

public static int findChessNum(int x, int y, int k) {  int result = 0;  for (int i = y; i <= x; i++) {    result += ((k >> (i - 1)) & 1);  }  return result;  }

取绝对值

  int abs(int n){      return (n ^ (n >> 31)) - (n >> 31);  }

只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:

输入: [2,2,1]输出: 1

示例 2:

输入: [4,1,2,1,2]输出: 4

这个题首先想到的就是异或的特性。相同的数字异或的结果为 0,那么出现奇数次的一定就是最后我们想要的结果。

public int singleNum(int[] nums){    int res = num[0];    for(int i=1;i<nums.length;i++){        res ^= nums[i];    }    return res;}

总结

功能示例位运算
去掉最后一位(101101->10110)x >> 1
在最后加一个0(101101->1011010)x < < 1
在最后加一个1(101101->1011011)x < < 1+1
把最后一位变成1(101100->101101)x | 1
把最后一位变成0(101101->101100)x | 1-1
最后一位取反(101101->101100)x ^ 1
把右数第k位变成1(101001->101101,k=3)x | (1 < < (k-1))
把右数第k位变成0(101101->101001,k=3)x & ~ (1 < < (k-1))
右数第k位取反(101001->101101,k=3)x ^ (1 < < (k-1))
取末三位(1101101->101)x & 7
取末k位(1101101->1101,k=5)x & ((1 < < k)-1)
取右数第k位(1101101->1,k=4)x >> (k-1) & 1
把末k位变成1(101001->101111,k=4)x | (1 < < k-1)
末k位取反(101001->100110,k=4)x ^ (1 < < k-1)
把右边连续的1变成0(100101111->100100000)x & (x+1)
把右起第一个0变成1(100101111->100111111)x | (x+1)
把右边连续的0变成1(11011000->11011111)x | (x-1)
取右边连续的1(100101111->1111)(x ^ (x+1)) >> 1
去掉右起第一个1的左边(100101000->1000)x & (x ^ (x-1))
判断奇数
(x&1)==1
判断偶数
(x&1)==0

感谢各位的阅读!关于“Java位运算的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Java位运算的示例分析

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

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

猜你喜欢
  • Java位运算的示例分析
    这篇文章给大家分享的是有关Java位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和...
    99+
    2023-06-02
  • java使用布尔运算代替位运算的示例分析
    这篇文章将为大家详细讲解有关java使用布尔运算代替位运算的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。布尔运算代替位运算虽然位运算的速度远远高于算术运算,但是在条件判断时,使用位运算替代布尔运...
    99+
    2023-06-27
  • Java的位运算实例代码分析
    今天小编给大家分享一下Java的位运算实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。位运算很久以前学习过位运算,...
    99+
    2023-07-06
  • shell中基本计算、逻辑运算、位运算的示例分析
    这篇文章给大家分享的是有关shell中基本计算、逻辑运算、位运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3...
    99+
    2023-06-09
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • java中位运算的使用示例
    这篇文章将为大家详细讲解有关java中位运算的使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们知道程序中的所有数在计算机内存中都是以二进制的形式储存的,而位运算就是直接对整数在内存中的二进制位进...
    99+
    2023-06-07
  • Java中BigDecimal基本运算的示例分析
    小编给大家分享一下Java中BigDecimal基本运算的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法:第一种:BigDecimal(doub...
    99+
    2023-05-30
    java bigdecimal
  • Java混合运算规则的示例分析
    这篇文章主要介绍了Java混合运算规则的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。重要规则://byte short char 做混...
    99+
    2023-05-31
    java
  • PHP运算符的示例分析
    这篇文章将为大家详细讲解有关PHP运算符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。l 逻辑运算符:概念:对表达式进行逻辑运算,运算出的结果是布尔类型的值(true,false)要求:参与逻辑...
    99+
    2023-06-15
  • php算术运算符的示例分析
    这篇文章主要介绍php算术运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数据库。4、面向对象编程:PHP...
    99+
    2023-06-14
  • Mysql位运算简化一对多关系的示例分析
    这篇文章主要介绍Mysql位运算简化一对多关系的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!语法& : 按位与,二进制位同时都为1的位设为1。| :  按...
    99+
    2024-04-02
  • python中DataFrame运算的示例分析
    这篇文章给大家分享的是有关python中DataFrame运算的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pytho...
    99+
    2023-06-15
  • php中运算符的示例分析
    这篇文章将为大家详细讲解有关php中运算符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。相等运算符与全等运算符都属于比较运算符,都是二元运算符,返回值为true、false。  1.相...
    99+
    2023-06-07
  • java数据类型和运算符的示例分析
    这篇文章给大家分享的是有关java数据类型和运算符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.整型变量1.基本格式int 变量名 = 初始值;代码示例:public class ...
    99+
    2023-06-14
  • python三元运算符的示例分析
    小编给大家分享一下python三元运算符的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!三元运算符:我们经常会根据条件,将变量设置成不同的值:if&nbs...
    99+
    2023-06-27
  • Java线程运行的示例分析
    这篇文章将为大家详细讲解有关Java线程运行的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。栈与栈帧JVM中由堆、栈、方法区所组成,其中栈内存就是分配给线程使用的,每个线程启动后,虚拟机都会为其分...
    99+
    2023-06-29
  • php中特殊运算符的示例分析
    这篇文章将为大家详细讲解有关php中特殊运算符的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。三元运算符 ? :格式:表达式1  表达式2 : 表达式3;如...
    99+
    2023-06-14
  • 数值运算shell脚本的示例分析
    这篇文章给大家分享的是有关数值运算shell脚本的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这次的shell案例比较简单,但有其特点。#!/bin/sh# scriptbc -&n...
    99+
    2023-06-09
  • java排序算法的示例分析
    这篇文章将为大家详细讲解有关java排序算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、直接插入排序基本思想:将一个记录插入到已排序的有序表中,使插入后的表仍然有序对初始关键字{49 38...
    99+
    2023-06-20
  • Python OpenCV形态学运算示例分析
    今天小编给大家分享一下Python OpenCV形态学运算示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作