原码反码补码

 计算机储存符号的时候,0表示+;1表示-;

计算机字长为8位;

原码是符号加上真值的绝对值,用第一位表示符号,其余位表示值;

[+1]原=00000001;

[-1]原=10000001;

反码:

正数的反码就是自己本身原码;

负数的反码是在原码的基础上符号位不变,其余的各位取反;

[+1]原=[00000001]原=[00000001]反;

[-1]原=[10000001]原=[11111110]反;

补码

正数的补码就是本身原码;

负数的反码是在原码的基础上,符号位不变,其余取反,最后加1;

[+1]原=[00000001]原=[00000001]反=[00000001]补;

[-1]原=[10000001]原=[11111110]反=[11111111]补;

正整数的原码反码补码都是一样的;

将整数转化成二进制的原码

package afterclass;

import java.util.Scanner;

public class a1 {
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入i的值");
        int i=sc.nextInt();
        int[] b;
        int t=0;
        b=new int[8];
        for(int j=7;j<0;j--)
        {
            b[j]=0;
        }
        if(i>=0)
        {
            b[7]=0;
        }
        else
        {
            b[7]=1;
            i=-i;
        }
        for(int j=0;j<7;j++)
        {
            b[j]=i%2;
            i=i/2;
            if(i==0)
            {
                t=j;
                break;
            }
            
        }
        
        System.out.print(b[7]);
        for(int j=6;j>t;j--)
        {
            System.out.print(b[j]);
            
        }
        
        for(int j=t;j>=0;j--)
        {
            System.out.print(b[j]);
        }
    }
}

反码

package afterclass;

import java.util.Scanner;

public class a1 {
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入i的值");
        int i=sc.nextInt();
        int[] b;
        int t=0;
        int d=0;
        b=new int[8];
        int[] c=new int[8];
        for(int j=7;j<0;j--)
        {
            b[j]=0;
        }
        if(i>=0)
        {
            b[7]=0;
            d=i;
        }
        else
        {
            b[7]=1;
            d=-i;
        }
        for(int j=0;j<7;j++)
        {
            b[j]=d%2;
            d=d/2;
            if(d==0)
            {
                t=j;
                break;
            }
            
        }
        if(i<0)
        {
        c[7]=b[7];
        
        for(int j=6;j>t;j--)
        {
            c[j]=b[j];
            
            
        }
        
        for(int j=t;j>=0;j--)
        {
            c[j]=b[j];
            
        }
        for(int j=6;j>=0;j--)
        {
            if(c[j]==0)
            {
                c[j]=1;
            }
            else
            {
                c[j]=0;
            }
        }
        for(int j=7;j>=0;j--)
        {
            System.out.print(c[j]);
        }
        }
        else
        {
            for(int j=7;j>=0;j--)
            {
                System.out.print(b[j]);
            }
        }
    }
}

2的原码是00000010;反码是00000010;补码是00000010;

-1的原码是10000001;反码是11111110;补码是11111111;

package zy01;

public class js02 {
    public static void main(String[] args)
    {
    int a=2;
    int b=-1;
    System.out.println(a&b);
    System.out.println(a|b);
    System.out.println(a^b);
    }
}

与&如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0。

2的反码是00000010;

-1的反码是11111110;

结果为       00000010;2

2的补码是00000010;

-1的补码是11111111;

结果为      00000010;2

运算符  或“|”  :有1为1,否则为0

2的反码是00000010;

-1的反码是11111110;

结果是     11111110;

减一:11111101;

然后按位取反(符号位不变)得到的是原码:10000010;-2

2的补码是00000010;

-1的补码是11111111;

结果是   11111111;

减一:11111110;

然后按位取反(符号位不变)得到的是原码:10000001;-1

当运算结果符号位是1为负数,那就需要进行减1操作,再按位取反,这个时候得到的才是正确的结果

运算符  异或^相同为0,不同为1

2的反码是00000010;

-1的反码是11111110;

结果是     11111100;

减一:11111011;

然后按位取反(符号位不变)得到原码:10000100;-4

2的补码是00000010;

-1的补码是11111111;

结果是      11111101;

减一:11111100;

然后按位取反(符号位不变)得到原码:10000011;-3

根据与 或 异或  的反码补码的运算得处java中是根据补码来运算的;

原文地址:https://www.cnblogs.com/1234yyf/p/11537799.html