位运算

作者: liut_2016 | 来源:发表于2016-09-23 10:43 被阅读44次

1. 原码反码补码:

计算机存储数据都是以二进制存储

byte 8位
short 16位
int 32位
long 64位

其中 最高位为符号位,0代表正数,1为负数,并且负数以补码的形式存在和参与计算,如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

关于原码,反码,补码

原码 即正确的值。
反码 正数不变,负数反码 符号位不变,其余取反。
补码 正数不变,负数为反码+1。

负数(-2)原码反码例如:
原码 1000 0010
反码 1111 1101
补码 1111 1110

2. 位移运算

  • a << b 左移运算
    二进制形式的a左移b位,b小于总位数,左端舍去,右端补零,正负可能发生变化。
  • a >> b 右移运算
    二进制形式的a右移b位,b小于总位数,右端舍去,左边正数补0,负数补1。
  • a >>> b 无符号右移运算
    二进制形式的a左移b位,b小于总位数,右端舍去,左端补零

3. 与,或,异或,非

位运算.png

& 同1则1
| 同0则0
^ 相同为零,不同为1
~ 取反

应用

  • & 取特定位
  • |某位 置1
  • ^特定位取反

例如 :


    public static void main(String[] args) {

        int b = -7;

        /**
         * 取特定位
         * 假设要取b的低四位
         * 则需要低四位全为1,其余为0
         * 即 0000 0000 0000 0000 0000 0000 0000 1111
         * 即0xf
         */

        System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
        System.out.println(Integer.toBinaryString(b&0xf));      //1001
        /**
         * 取特定位  某位置0
         * 假设要取b的第五位
         * 则需要第五位为1,其余为0
         * 即 0000 0000 0000 0000 0000 0000 0001 0000
         * 即0x10
         * 右移 5-1 >>> 4
         */
        System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
        System.out.println(Integer.toBinaryString(b&0x10>>>4));     //1

        //--------------------------------------------------------------



        /**
         * | 某位 置1;
         * 假设要b的第3位 置1
         * 则需要一个 该位为1,其余为0的数
         * 即0000 0000 0000 0000 0000 0000 0000 0100
         * 即0x4
         */
        System.out.println(Integer.toBinaryString(b));          //1111 1111 1111 1111 1111 1111 1111 1001
        System.out.println(Integer.toBinaryString(b|0x4));      //1111 1111 1111 1111 1111 1111 1111 1101

        //----------------------------------------------------------------

        /**
         * ^ 使特定位取反
         * 假设需要b低4位取反
         * 则需要 一个低四位为1,其余为0的数
         * 即 0000 0000 0000 0000 0000 0000 0000 1111
         * 即 0xf
         */
        System.out.println(Integer.toBinaryString(b));              //1111 1111 1111 1111 1111 1111 1111 1001
        System.out.println(Integer.toBinaryString(b^0xf));          //1111 1111 1111 1111 1111 1111 1111 0110
        /**
         * 假设需要b第2位取反
         * 则需要 一个第3位为1,其余为0的数
         * 即 0000 0000 0000 0000 0000 0000 0000 0010
         * 即 0x2
         */
        System.out.println(Integer.toBinaryString(b));              //1111 1111 1111 1111 1111 1111 1111 1001
        System.out.println(Integer.toBinaryString(b^0x2));          //1111 1111 1111 1111 1111 1111 1111 1011

    }

4.复合赋值运算符

位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

&=例:a &= b相当于a=a & b
|= 例:a |= b相当于a=a | b
>>= 例:a >>= b 相当于a=a >> b
<<= 例:a <<= b 相当于a=a << b
^= 例:a ^= b 相当于a=a ^ b

相关文章

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • 位运算及用位运算实现权限控制

    请自行补习位运算相关知识 位运算 位运算示例 权限控制

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 位运算

    位运算 1. &:按位与 规律:一假则假任何位上的数和1相&得到的结果还是那个数 2. |:按位或 规律:一真则真...

  • 位运算

    https://leetcode.com/problems/gray-code/description/这个位运算...

  • 位运算

    位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不...

  • 位运算

    1.不用加减乘除做加法 解法:分为三步①各位相加不进位,即先按位异或;②做进位,按位与并左移位;③结果相加,直至没...

  • 位运算

    位运算不仅可以简化某些复杂的操作,而且具有更快的计算速度。典型的应用就是除法,交换两个数值,以及在一个数组中寻找只...

网友评论

      本文标题:位运算

      本文链接:https://www.haomeiwen.com/subject/htdtyttx.html