位运算

什么是位操作?

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

算术运算简称运算。指按照规定的法则和顺序对式题或算式进行运算,并求出结果的过程。包括:加法、减法、乘法、除法、乘方、开方等几种运算形式。

例如,查看算术和位操作方法在查找RGB值的绿色部分时的区别:

  • 算术操作:
(rgb / 256) % 256
  • 位运算:
(rgb >> 8) & 0xFF

虽然两者都做相同的事情,但第二种方法的速度要快得多,因为它直接在内存中工作,而不是通过抽象级别。
我们将在本文后面探讨每个操作符的作用(>>和&)。

位运算操作

按位操作采用一个或多个位模式或二进制数字,并在位级别对它们进行操作。它们本质上是我们用来操纵bit的工具,位运算符直接操作bit数据。

位运算优势

  1. 它们是快速而简单的动作。

  2. 它们由处理器直接支持。

  3. 它们用于操纵用于比较和计算的值。

  4. 位运算非常简单,比算术运算快得多。

让我们快速了解一下每种主要的位运算符及其用法。

& 操作符(与)

AND(&)是一个二进制运算符,用于比较两个长度相等的操作数。操作数从可读形式转换为二进制表示形式。对于每个位,该操作检查两个操作数中的两个位是否都是1。如果是,则该位在答案中设置为1。否则,相应的结果位设置为0。

它本质上是将每个位乘以另一个操作数中的相应位。因为将任何值乘以0得到0,与任何0位的AND比较将得到0。

如果两个输入位为1,则输出为1。

  • 1&1 = 1。

在所有其他情况下,其值为0,例如:

  • 1&0 = 0。

  • 0&1 = 0。

  • 0&0 = 0。

    0101 (decimal 5)
AND 0011 (decimal 3)

0∗0=0
1 * 0 = 0
0 * 1 = 0 1∗1=1

因此可以计算出值为

0001

java代码;

class AndOperation {public static void main( String args[] ) {int x = 12;int y = 10;System.out.println("位运算操作 (" + x + " , " + y + ") is: " + (x & y)); // yields to 8}
}

|操作符(或)

OR运算符(|)是一个二进制运算符,它接受两个等长的操作数,但将它们与AND进行相反的比较;如果相应的位为1,则答案为1。否则,答案为0。换句话说,如果给定的输入之一为1,则按位OR返回“1”。

如果两个输入位为0,则输出为0。

  • 0 | 0 = 0。
    在所有其他情况下,它是1。例如:

  • 1 | 0 = 1。

  • 0 | 1 = 1。

  • 1 | 1 = 1。

a = 12
b = 10
---------------------------------
a 二进制 : 0000 0000 0000 1100
b 二进制 : 0000 0000 0000 1010
---------------------------------
a | b   : 0000 0000 0000 1110
---------------------------------

java代码;

class OROperation {private static int helper(int x, int y) {return x | y;}public static void main(String[] args) {int x = 12;int y = 10;System.out.println("位运算操作 " + x + ", " + y + " is: " + helper(x, y)); // yields to 14}
}

~ 操作符(取反)

NOT(~)或有时称为位补码运算符,是一种一元运算,它接受单个输入,并将二进制表示中的每一位换成相反的值。

0的所有实例都变为1,1的所有实例都变为0。换句话说,不反转每个输入位。这个倒序被称为位序列的一的补码。

例如,考虑x=1。x的二进制数表示为:x=00000000 00000000 00000000 00000001现在,~x是:x=11111111 11111111 11111111 11111110

这使得数字为负数,因为任何以1开头的位集合都是负数。

java代码;

class NOTOperation {public static void main( String args[] ) {int a = 1;System.out.println("位运算操作  : " + ~a);}
}

^ 操作符(异或)

按位异或运算(^)是“异或”的缩写,是一个二进制运算符,它接受两个输入参数并比较每个对应的位。如果位是相反的,则结果在该位等于1。如果一样则返回0。

  • 1^1 = 0。

  • 0^0 = 0。

  • 1^0 = 1。

  • 0^1 = 1。

例如:

a = 12
b = 10
---------------------------------
a 二进制 : 0000 0000 0000 1100
b 二进制 : 0000 0000 0000 1010
---------------------------------
a ^ b   : 0000 0000 0000 0110
---------------------------------

java代码:

class XOROperation {public static void main( String args[] ) {int x = 12;int y = 10;System.out.println("位运算操作 (x , y) is : " + (x ^ y)); // yields to 6}
}

左右位移操作符号(>> << >>> <<<)

位移位是一种按位操作,其中移动一系列位的顺序以有效地执行数学运算。位移位将数字二进制表示形式中的每个数字向左或向右移动第二个操作数指定的空格数。

这些运算符可以应用于整数类型,如int、long、short、byte或char。

  • 左移位:<<是左移位运算符,满足逻辑和算术移位的需要。

  • 算术/有符号右移:>>是算术(或有符号)右移运算符。

  • 逻辑/无符号右移:>>>是逻辑(或无符号)右移运算符。

在Java中,所有整数数据类型都是有符号的,<<和>>仅仅是算术移位。

下面是一个左移的例子:

6 = 00000000 00000000 00000000 00000110

将该位模式向左移动一个位置(6<<1)得到数字12:

6<<1 = 00000000 00000000 00000000 00001100

<<数字向左移动了一个位置,右边的最后一个数字填充了零。注意,左移相当于2的幂的乘法。同理>>相当于去除最后一个bit位置,然后第一个bit补0。

java代码:

class LeftShift {private static int helper(int number, int i) {return number << i;// multiplies `number` with 2^i times.}public static void main(String[] args) {int number = 100;System.out.println(number + " shifted 1 position left, yields to " + helper(number, 1));System.out.println(number + " shifted 2 positions left, yields to " + helper(number, 2));System.out.println(number + " shifted 3 positions left, yields to " + helper(number, 3));System.out.println(number + " shifted 4 positions left, yields to " + helper(number, 4));}
}

位运算技巧

现在,让我们看看使用位运算符可以实现的一些技巧。

检查数字是否为偶数

这一个测试你的知识如何和工作,以及如何奇偶数不同的二进制数。您可以简单地使用:

(x & 1 ) == 0

任何时候,奇数最后一位bit为1,1的二进制为 0001 当x&1时候只要判断结果等于1则,x最后一个bit就是为1,此时为奇数。

将字符转换为大写或小写

这个技巧要求你有对二进制大小写字符的知识。您可以使用ch^=32将任何字符ch转换为相反的大小写。

这是因为小写字母和大写字母的二进制表示几乎相同,只有1位不同。

使用异或操作可以切换单个位并将其交换为相反的值,从而使小写字符变为大写,反之亦然。

public class Test
{ static int x=32;
】static String toggleCase(char[] a) { for (int i=0; i<a.length; i++) { a[i]^=32; } return new String(a); } public static void main(String[] args)  { String str = "CheRrY"; System.out.print("Toggle case: "); str = toggleCase(str.toCharArray()); System.out.println(str); System.out.print("Original string: "); str = toggleCase(str.toCharArray()); System.out.println(str);     }
} 

结束

识别下方二维码!回复: 入群 ,扫码加入我们交流群!

java中位运算详解相关推荐

  1. 一篇搞定位运算——java位运算详解

    java位运算详解 前言 一.位运算符 &:按位与 |:按位或 ~:按位非 ^:按位异或 <<:左位移运算符 >>:右位移运算符 <<<:无符号右移运 ...

  2. Java中的byte详解

    Java中的byte详解 介绍 byte,即字节,由8位的二进制组成.在Java中,byte类型的数据是8位带符号的二进制数. 在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在 ...

  3. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  4. 位运算详解+竞赛常见用法总结

    目录 一.位运算详解 二.位运算应用 1.快速幂 2.给定一个数组A, 长度为n,求下面这段程序的值 3.数数字 4.数数字 2 5.nim博弈问题: 6.树状数组 7.判断一个数x是不是2的某次方 ...

  5. php的位运算,php的位运算详解

    php的运算符有一类是位运算的,本文主要和大家分享php的位运算详解,希望能帮助到大家. 一:& And按位与 $a&$b 将把二进制$a和二进制$b位数都为1的设为1,其他位为0 例 ...

  6. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  7. JAVA中的Random详解

    JAVA中的Random详解 首先,在JDK自带的常用的random中有两个,这俩都是产生随机数的,不过一个是util下的random,另外一个是Math下的.我们分别介绍一下 util中的rando ...

  8. java中new关键字详解

    java中new关键字详解 在java中我们可以经常使用new来创建一个对象,但是这对于初学者来说可能只会使用却不能理解new关键字和它的语法 new关键字的语法 注意使用前先导包,一般我们使用ide ...

  9. 算法之美 | 位运算的巧妙奥秘(一) | JAVA中位运算的深入浅出

    文章目录 前言 一.位运算符号 二.位运算的运算规则 扩展 前言 传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基 ...

最新文章

  1. 阿里三面让我现场改造Spring框架,明天带他去爬山!
  2. Mapreduce 任务提交源码分析1
  3. Arduino生成ATmega8的运行程序并下载
  4. Linux_RAID
  5. Spring Task配置
  6. mybatis中使用mysql的模糊查询字符串拼接(like)
  7. UltraEdit常用配置搭建Java/C开发环境
  8. checkbox和radio的样式美化问题
  9. C#基础解析之Ⅲ 【循环结构】
  10. GotFocus和PreviewLeftButtonDown事件
  11. js创建节点,小试牛刀
  12. 阿里云助力宁波市教育局“甬上云校”停课不停学
  13. 线性回归(一元多元)建模步骤
  14. 分享精心收藏的前台开发素材网站,都是干货
  15. Vimtutor中文版
  16. vivo手机如何开启云服务器,怎么开启vivo手机中的云服务自动备份功能
  17. c语言程序设计自学网进阶,谭浩强老师C语言教程程序设计
  18. 方舟外服服务器网站,方舟外服开服表,固定更新
  19. 多核处理器真的能提升软件系统性能吗?
  20. js根据身份证 判断性别 出生、年龄、出生年月日

热门文章

  1. HTTP工作原理详解
  2. 中国象棋程序的设计与实现(九)–棋子点,棋子的小窝
  3. 不知如何选股?不知哪种指标策略可靠?量化分析比较VRSI、BBIBOLL、WR、BIAS、RSI指标策略收益情况
  4. 信号上升沿陡峭与信号带宽关系
  5. java 字符串处理流程_一文带你了解Java字符串处理(String,StringBuffer,StringBuild)...
  6. 偶尔会连不上网,可能是你的DNS没配对
  7. 【SpringBoot学习笔记】运行错误:No fallback instance of type class found for feign client
  8. html五子棋悔棋,原生 JS + Canvas 实现五子棋游戏
  9. kafka 安装及测试
  10. 微信小程序 --- 实现大富翁小游戏(DEMO 半成品)