计算机储存符号的时候,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中是根据补码来运算的;