首页 > 其他分享 >位运算(原码,反码,补码)

位运算(原码,反码,补码)

时间:2023-12-08 15:58:23浏览次数:31  
标签:11111111 反码 运算 00000000 补码 原码

免责声明:java基础资料均来自于韩顺平老师的《循序渐进学Java零基础》教案,具体视频内容可以去B站观看,这些资料仅用于学习交流,不得转载用于商业活动

1.位运算

1.1 原码,反码,补码

对有符号的数而言:

  1. 二进制的最高位是符号位:0表示正数,1表示负数(0->0 1->-)
  2. 正数的原码,反码,补码都一样(三码合一)
  3. 负数的反码=他的原码符号位不变,其他位取反(0变1,1变0)
  4. 负数的补码=它的反码+1  负数的反码=负数的补码-1
  5. 0的反码 补码都是0
  6. Java没有无符号数,换言之,Java中的数都是由符号的
  7. 在计算机运算的时候,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,要看他的原码(重点)

1.2 位运算符

Java中有7个位运算(&,|,^,~,>>,<<,>>>)

public class BitOperator {
    public static void main(String[] args) {
        //2&3 推导
        //1.先得到2的补码 =>2的原码 00000000 00000000 00000000 00000010
        //2的补码 00000000 00000000 00000000 00000010
        //2. 3的补码 3的原码 00000000 00000000 00000000 00000011
        //3的补码 00000000 00000000 00000000 00000011
        //3 按位&
        // 00000000 00000000 00000000 00000010
        // 00000000 00000000 00000000 00000011 &
        // 00000000 00000000 00000000 00000010 运算后的补码
        //运算后的原码 也是 00000000 00000000 00000000 00000010
        //结果就是 2
        System.out.println(2&3); //2
        //~-2 推导
        //1 先得到-2的原码 10000000 00000000 00000000 00000010
        //-2的反码 11111111 11111111 11111111 11111101
        //-2的补码 11111111 11111111 11111111 11111110
        //取反(~2)操作 11111111 11111111 11111111 11111110
        //             00000000 00000000 00000000 00000001 (补码)
        // 00000000 00000000 00000000 00000001 最高位是0 正数 所以他的原码是
        // 原码:00000000 00000000 00000000 00000001
        System.out.println(~-2); //1

        //~2取反推导
        //得到补码   00000000 00000000 00000000 00000010
        //取反操作~2 11111111 11111111 11111111 11111101(运算后补码)
        // 是负数 负数的反码 11111111 11111111 11111111 11111100
        // 负数的原码 100000000 00000000 00000000 00000011
        System.out.println(~2); //-3
    }
}

>>、<<、>>>,运算规则是:

算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位

算术左移<<:符号位不变,低位补0

>>> 逻辑右移也叫无符号右移: 运算规则是:低位溢出,高位补0

public class BitOperator {
    public static void main(String[] args) {
        int a=1>>2; //1=> 00000001=>00000000 本质1/2/2=0
        int c=1<<2; //1=> 00000001=>00000100 本质1*2*2=4
        System.out.println(a);
        System.out.println(c);
    }
}

标签:11111111,反码,运算,00000000,补码,原码
From: https://www.cnblogs.com/lgs-tech/p/17888303.html

相关文章

  • 原码、反码、补码再探
    原码、反码、补码再探概述三个计算机用来表达负数的形式。原码通过第一位的\(0\)来直接表示正数,\(1\)来直接表示负数。然而计算机并不用这种方式。反码即把要表示的负数的绝对值对应的二进制全部取反来表示。坏处是\(0\)有两种表达方式,全\(0\)和全\(1\),所以......
  • 补码减法与溢出
    已知二进制数x=-0.11011,y=0.10101,用补码计算x-y,同时指出运算结果是否溢出。(设字长8位)。如何求负的小数的二进制补码?负的小数的二进制补码可以通过以下步骤求得:将小数部分转换为二进制形式。将整数部分和小数部分合并为原码。将原码取反得到反码。对反码加1得到补码。二进......
  • 补码表示法
    所谓的补码表示法,它是有符号整数最常用的二进制表示法。对正数求反码(即对每个位进行NOT运算),然后加1,舍弃MSB的任何进位,就可以得到这个数字的负数。表示+1的0001的反码是1110,加1就可以得到表示–1的1111。同理,+2是0010,它的反码是1101,再加1就可以得到表示–2的1110。......
  • 补码反码
    #include<bits/stdc++.h>usingnamespacestd;intmain(){boolTGDCN=true;strings;stringa;cin>>s;a=s;if(s[0]=='0'){cout<<s;}else{for(inti=1;i<s.size();......
  • 原码--转--反码--补码
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ stringa; cin>>a; intn=a.size(); if(a[0]=='0'){ cout<<a; }else{ for(inti=1;i<=a.size();i++){ if(a[i]=='1'){ a[i]='0'; }else{......
  • 原码转补码反码
    #include<bits/stdc++.h>usingnamespacestd;stringa;intc=0;voidfam(){ if(a[0]=='0'){ cout<<a; }else{ cout<<'1'; for(inti=1;i<a.size();i++){ if(a[i]=='0'){ cout<<'1';......
  • 原码转反补码
    #include<iostream>usingnamespacestd;intmain(){ stringstr; chart; booljinwei=true; booltf; cin>>str>>t; if(str[0]=='0'&&t=='f'){ cout<<str; }elseif(str[0]=='1'&&t==&#......
  • 原码、反码、补码学习
    Java没有无符号数,所以首位都是符号位标志位0表示正数,1表示负数原码是数字的二进制表示,首位为符号位数字的表示用原码,计算用补码(因为计算机只有加法器,减法转换为加法)正数的原码=反码=补码(三码合一)负数反码=原码符号位不变,其余取反负数的补码=反码+10的补码=0000......
  • 原码, 反码, 补码
    原码,反码,补码原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负.原码的弊端:1,利用原码进行计算的时候,如果是整数完全没有问题.2,但是如果是负数计算,结果就出错,实际运算的方向,跟正确的运算方向是相反的.反码出现的目的:为了解决原码不能计算负数......
  • 计算32位二进制整数中1的个数(包括负数补码)
    引言:在计算机科学和编程中,位操作是一项重要的技能。一个常见的任务是计算一个32位二进制整数中1的个数,包括负数的补码表示。这个问题有多种解决方法,本博客将介绍一种高效的解决方案,同时提供详细的代码案例。背景知识:在正整数的二进制表示中,1的个数表示了这个数的二进制形式中有多少......