逻辑运算与位运算----新人学习笔记

1.概念

    逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律。

    位运算是指以二进制位为对象的运算。在系统软件中,常要处理二进制位的问题。例如,将一个存储单元中的各二进制位左移或右移一位、两个数按位相加等。

源码,反码,补码

原码表示法在数值前面增加了一位符号位(即最高位为符号位):正该位为0,负该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

反码就是原码符号位除外,其他位按位取反。

正整数的补码是其二进制表示,与原码相同 

例:+9的补码是00001001。

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 。

例:求-5的补码。

-5对应带符号位负数5(10000101)→除符号位外所有位取反(11111010)→加 00000001为 (11111011),所以-5的补码是11111011。

0的补码表示是唯一 

[+0]补=[+0]反=[+0]原=00000000

[ -0]补=11111111+1=00000000

2.位运算

2.1 按位取反运算   "~"

运算符为"~",将一个数据中所有位都取其相反值,即1变0,0变1。
 

例题: 

a=(18)10 =(00010010)2 ,

则~a等于(11101101)2 ,即(237)10

在java代码中如下

​
  public static void main(String[] args) {
        long a = 18;
        long b = ~a;
        System.out.println(b);

​           b = -19

~a=(11101101)2的结果是一负数的补码,转换为原码时,第1位符号位不变,对剩余的部分先减1,再全部取反,因此得到的二进制原码为:10010011,即十进制的-19。

2.2 左移运算"<<"

左移运算的功能是将一个数据所有位向左移若干位,高位移出的部分舍去,低位自动补零。

例题: 

a=(18)10 =(00010010)2 ,

a <<3的结果是(10010000)2 ,即(144)10

java程序如下

public static void main(String[] args) {
        int a =18;
        int b=a<<3;
        System.out.println(b);

    }


       b=144

对于无符号数来说,在左移的过程中如果没有高位的丢失,左移1位相当于乘2,左移2位相当于乘4。

2.3 右移运算">>"

右移运算的功能是将一个数据所有位向右移若干位,右边(低位)移出的部分舍去,左边(高位)移入的二进制数分两种情况:对于无符号数和正整数,高位补0;对于负整数,高位补1。

例题: 

a=(18)10 =(00010010)2 ,

则 a >>3的结果是(00000010)2,即(2)10

java程序如下

public static void main(String[] args) {
        int a =18;
        int b=a>>3;
        System.out.println(b);

    }


     b=2

2.4 按位与运算"&"

例题: 

运算规则为: 1&1=1 0&1=0 1&0=0 0&0=0

对于无符号数a=(173)10=(10101101)2,

b=(203)10=(11001011)2,

则a&b = (10001001)2 =(137)10

java代码如下

 public static void main(String[] args) {
        int a = 173;
        int b= 203;
        System.out.println(a&b);

    }

         a&b = 137

例题: 

对于有符号数a=(-83)10=(10101101)2 ,

b=(-53)10=(11001011)2 ,

则a&b = (10001001)2 =(-119)10 。

以上二进制形式是负数的补码。

public static void main(String[] args) {
        int a =-83;
        int b =-53;
        System.out.println(a&b);

    }

       a&b = -119  

2.5 按位或运算"|"

两个运算量的各个相应位分别进行“或”运算。

运算规则为: 1|1=1 0|1=1 1|0=1 0|0=0;

例题: 

对于无符号数a=(173)10=(10101101)2,

b=(203)10=(11001011)2,

则a|b = (11101111)2 =(239)10

java 代码如下

public static void main(String[] args) {
        int a = 173;
        int b = 203;
        System.out.println(a|b);

    }
          
           a|b = 239

例题: 

对于有符号数

a=(-83)10=(10101101)2,

b=(-53)10=(11001011)2,

则a|b = (11101111)2 =(-17)10

java代码如下

public static void main(String[] args) {
        int a = -83;
        int b = -53;
        System.out.println(a|b);

    }

           a|b = -17

2.6 按位异或运算"^"

将两个运算量的各个相应位分别进行“异或”运算。

运算规则为: 1^1=0 0^1=1 1^0=1 0^0=0 

对于无符号数

a=(173)10=(10101101)2,

b=(203)10=(11001011)2,

则a^b = (11101111)2 =(102)10

java代码如下

    public static void main(String[] args) {
        int a = 173;
        int b = 203;
        System.out.println(a^b);

    }
 
           a^b = 102

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值