Java的运算符--与(&)、非(~)、或(|)、异或(^)详解

public class Test1 {

    public static void main(String[] args) {

        /* 符号为:最高位同时表示图号,0为正数,1为负数 */

        /*
         * 1、二进制转换为十进制
         *
         * 二进制转换为10进制的规律为:每位的值 * 2的(当前位减1次方)
         * 例如: 00000001 = 0 * 2^7 + 0 * 2^6 +0 * 2^5
         * + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1
         * 00000010 = 0 * 2^7 + 0 * 2^6 + 0 * 2^5
         * + 0 * 2^4 + 0 * 2^3 + 0 * 2^2+ 1 * 2^1 + 0 * 2^0 = 2
         *
         * 2、二进制的符号位:最高位表示符号位,0表示正数, 1表示负数
         *
         * 3、将二进制负数转换为十进制:先对该二进制数取反,然后加1,再转换为十进制,然后在前面加上负号
         * 例如: 10101011 最高位为1,所以为负数。
         * 第一步:取反: 0101 0100 ,
         * 第二步:加1 : 0101 0101,
         * 第三步:转换为10进制:85
         * 第四步:加上负号: -85 。
         * 所以 1010 1011 转换为十进制为 -85
         *
         * 4、将十进制负数转换为二进制:先得到该十进制负数的绝对值,然后转换为二进制,然后将该二进制取反,然后加1
         * 例如:-85
         * 第一步:得到绝对值 85
         * 第二步:转换为二进制:0101 0101
         * 第三步:取反: 1010 1010
         * 第四步:加1: 1010 1011
         * 所以,-85转换为二进制为 1010 1011
         */

        /*
         * ~ ‘非‘ 运算符是将目标数的进制去反,即0变成1 ,1变成0。
         * 例如: 2的二进制码为 00000010 ,它取反为11111101。
         * 可见取反后结果为负数(二进制负数转换为十进制的步骤为:将二进制取反,然后+1)
         * 将 1111 1101 转换为10进制
         * 第一步:取反得到 0000 0010,
         * 第二步:加1,得到 0000 0011 ,得到的结果为3 ,
         * 第三步:在前面加上负号就可以了
         * 所以结果为-3
         */
        System.out.println(~2);

        /*
         * ^ 异或,计算方式为:两个二进制数的位相同则为0 不同则为1
         * 23转换为二进制为:0001 0111
         * 12转换为二进制为:0000 1100
         *             —————————
         * 计算结果为:              0001 1011 = 27
         */
        System.out.println(23 ^ 12);

        /*
         * & 按位与,计算方式为:两个二进制数的位都为1则为1 ,否则为0
         * 1的二进制为:0000 0001
         * 2的二进制为:0000 0010
         *          —————————
         * 结果为 :  0000 0000 = 0
         */
        System.out.println(1 & 2);

        /*
         * | 按位或,计算方式为:两个二进制位有一个为1就为1,否者为0
         * 5 的二进制为:0000 0101
         * 6 的二进制为:0000 0110
         *          —————————
         * 结果为:  0000 0111 = 7
         */
        System.out.println(5 | 6);

        /*
         * >> "有符号"右移位,
         * 符号左边表示要被移位的数,右边表示需要移的位数,结果为正数则在左边补0,否则补1
         * 3 的二进制为:0000 0011
         * 第一步:向右移动1位:最低位右边的1被移除   000 0001
         * 第二步:是正数,最高位左边补0, 0000 0001 = 1。
         */
        System.out.println(3 >> 1);

        /*
         * -3默认int型 32位
         * 先转换二进制:
         *  绝对值:3
         *  绝对值二进制:0000 0000 0000 0000 0000 0000 0000 0011
         *   取反:  1111 1111 1111 1111 1111 1111 1111 1100
         *   加1:   1111 1111 1111 1111 1111 1111 1111 1101
         *  (-3的二进制   1111 1111 1111 1111 1111 1111 1111 1101)
         * 将二进制结果右移动一位,由于是负数,所以要在最高位补1
         *           1111 1111 1111 1111 1111 1111 1111 1110
         * 得到的结果是负数
         *   取反:  0000 0000 0000 0000 0000 0000 0000 0001
         *   加1:   0000 0000 0000 0000 0000 0000 0000 0010
         *   得到2,结果加上负号即为该二进制对应的十进制:-2
         */
        System.out.println(-3 >> 1);

        /*
         * >>> "无符号"右移运算符,
         * 将运算符左边的对象向右移动运算符右边指定的位数。
         * 采用0扩展机制,也就是说,无论值的正负,都在高位补0.
         * -3默认int型 32位
         * 先转换二进制:
         *  绝对值:3
         *  绝对值二进制:0000 0000 0000 0000 0000 0000 0000 0011
         *   取反:  1111 1111 1111 1111 1111 1111 1111 1100
         *   加1:   1111 1111 1111 1111 1111 1111 1111 1101
         * 将二进制结果右移一位,因为无符号所以。最高位补0
         *           0111 1111 1111 1111 1111 1111 1111 1110
         * 结果为:2147483646
         */
        System.out.println(-3 >>> 1);
    }
}
时间: 2024-10-15 03:54:56

Java的运算符--与(&)、非(~)、或(|)、异或(^)详解的相关文章

java中运算符与表达式

运算符是用来完成一个动作的特定语言的语法记号. –赋值运算符 –增减运算符 –算术运算符 –关系运算符 –逻辑运算符 -位运算符 运算符 Java 加 + 减 - 乘 * 除 / 取模 % 1.整数运算和小数运算 int n =12 ; int m = 5; float y = n/m; System.out.println(n/m);// 2 System.out.println(n/5.0);// 2.4 System.out.println(12.0/m);// 2.4 System.ou

java中运算符详解

前言 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.JAVA中常见的运算符有很多种,大致分为以下几种,常见的几种运算符如下图: 算术运算符 加.减.乘.除.求余.例++.--.%./.  赋值运算符 为变量或常量起到赋值作用的.例如=.+=.*= 关系运算符 判断数据大小的,结果为一个布尔值.例如>.>=.!=.== 逻辑运算符 进行逻辑运算,运算的成员为布尔值,结果也为布尔值.例如&&.||.!. 条件运算符 也称三目运算符,表达式为(a<b)?a:b

Java的运算符

和C语言相比,Java的运算符就要复杂一点,类型也相对的多了那么一点点.下面就是我写的Java运算符.Java的运算符 运算符:1.增量和减量运算:+.-.*. 2.移动运算符:>>=.<<=.>>>=.<<<= 3.布尔运算符 &和 如:(a>0)&(a<1) && 短路和 如:(a>0)&(a<1) 区别在于:当第一个表达式为假时,&&会短路,既不会判断第二个表达

JAVA的运算符和条件结构

一.JAVA的运算符. 1.赋值运算符 赋值就是把一个变量的值赋给另一个变量. 语法: 变量名=表达式     例如  n = m + 5 2.算术运算符      算术运算符是数学中常用的加.减.乘.除.余.(+.-.*./.%)   复合算术运算符:+=.-=.*=./=.%= 例如 a+=1 就是 a = a + 1   自增自减运算符:++.- -. 例如 a++ 就是 a = a+1 注意!a++是先运算在赋值,而++a是先赋值在运算!! 3.关系运算符 关系运算符就是比较两个操作数的

【java提高】(17)---Java 位运算符

Java 位运算符 &.|.^.~.<<.>> 以前学过有关java的运算符,不过开发了这么久也很少用过这个.现在由于开发需要,所以现在再来回顾整理下有关java的运算符. 主要运算符有以下:与(&).或(|).异或(^).取反(~).左移(<<).右移(>>). 一 与(&) 和 (|) 1.&(按位与) 规则:将两边的数转换为二进制位,然后运算最终值.运算规则即(两个为真才为真)1&1=1 , 1&0=0

java移位运算符详解[转]

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则 按

java移位运算符详解

java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移).1.左移运算符左移运算符<<使指定值的所有位都左移规定的次数.1)它的通用格式如下所示:value << numnum 指定要移位值value 移动的位数.左移的规则只记住一点:丢弃最高位,0补最低位如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模.如对int型移动33位,实际上只移动了332=1位. 2)运算规则按二进制形式把所有的

java关系运算符

1.  <=  >=       小于等于,大于等于  ( 大于小于>< ) 2.  ==             是否等于 3.  !=              不等于 4.  c=a>b?a:b;           a>b是真值的话,就给:左边的数给c,即c=a,如是假值就给右边数c=b java关系运算符,码迷,mamicode.com

java 增量运算符

//java 增量运算符 public class Test16{ public static void main(String args[]) { int x1=10; x1+=3; //x1=x1+3,注意这里不用再定义int x1=x1+3,前面已确定了x1的数据类型 System.out.println(x1); } } //result:13

Java 理论与实践: 非阻塞算法简介--转载

在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保执行 synchronized 块的线程的动作,能够被后来执行受相同锁保护的synchronized 块的其他线程看到.在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作. 在 “流行的原子” 一文中,我们研究了原子