原码、反码、补码与位运算

目录导引

  一、原码、反码、补码

  二、位运算

一、原码、反码、补码

  计算机只有加法运算器,计算器中存储、计算数据都是补码,正数和0的原码、反码、补码相同,负数的原码、反码、补码不同。

  原码:符号位+绝对值(0表示正数,1表示负数)

  反码:符号位不变,其余位取反

  补码:反码+1

  1、为什么要用补码存储,以及补码计算?

  因为原码和反码计算会出现+0 和 -0以及计算错误问题,而补码是正确而简单的,符号位也直接参与运算。

  示例:

  int是4字节,1字节是8位,所以一个int值是32位,第一位是符号位,所以int的取值范围是 -2^31 ~ 2^31-1(10000000 00000000 00000000 00000000~01111111 11111111 11111111 11111111,该二进制是补码)

  分别计算 2+(-1)和1+(-1),过程如下:

  2的原码、反码、补码分别是 00000000 00000000 00000010,00000000 00000000 00000010,00000000 00000000 00000010

  1的原码、反码、补码分别是 00000000 00000000 00000001,00000000 00000000 00000001,00000000 00000000 00000001

  -1的原码、反码、补码分别是 10000000 00000000 00000001,11111111 11111111 11111111 11111110,11111111 11111111 11111111 11111111

  2和-1原码相加,结果为:10000000 00000000 00000011(原码),0代表正数,1代表负数,所以值为-3,错误。

  2和-1反码相加,结果为:00000000 00000000 00000000(反码),对应原码的结果为00000000 00000000 00000000(原码),值为0,错误。

  2和-1补码相加,结果为:00000000 00000000 00000001(补码),对应原码的结果为00000000 00000000 00000001(原码),值为1,正确。

  1和-1原码相加,结果为:10000000 00000000 00000010(原码),值为-2,错误。

  1和-1反码相加,结果为:11111111 11111111 11111111 11111111(反码),对应原码的结果为10000000 00000000 00000000(原码),值为-0,不准确。(关于+0和-0的设计,有兴趣可自行百度)

  1和-1补码相加,结果为:00000000 00000000 00000000(补码),对应原码的结果为00000000 00000000 00000000(原码),值为0,正确。

二、位运算

  位运算符包括: 与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)、无符号右移(>>>)

  &:二进制位同时为1时,结果为1,否则为0   

   | :位有一个为1时,结果为1,否则为0

  ~:位0变1,1变0

  ^:位不同时,结果为1,否则为0

  <<:位整体向左移动,右边补0

  >>:位整体向右移动,正数左边补0,负数左边补1

  >>>:位整体向右移动,左边补0

  示例:

public class BitOperationTest {

    public static void main(String[] args) {        int a = 13, b = 6;        System.out.println("  a   :" + getBinaryStr(a));        System.out.println("  b   :" + getBinaryStr(b));        System.out.println(" a&b  :" + getBinaryStr(a & b));        System.out.println(" a|b  :" + getBinaryStr(a | b));        System.out.println("  ~a  :" + getBinaryStr(~a));        System.out.println(" a^b  :" + getBinaryStr(a ^ b));        System.out.println(" a<<b :" + getBinaryStr(a << b));        System.out.println(" a>>b :" + getBinaryStr(a >> (b - 4)));        System.out.println("  -a  :" + getBinaryStr(-a));        System.out.println(" a>>>b:" + getBinaryStr(a >> (b - 4)));        System.out.println("-a>>>b:" + getBinaryStr((-a) >> (b - 4)));    }

    private static String getBinaryStr(int n) {        StringBuilder str = new StringBuilder(Integer.toBinaryString(n));        int len = str.length();        if (len < 32) {            for (int i = 0; i < 32 - len; i++) {                str.insert(0, "0");            }        }        return str.substring(0, 8) + " " + str.substring(8, 16) + " " + str.substring(16, 24) + " " + str.substring(24, 32);    }}
//Result    a    :00000000 00000000 00000000 00001101   b    :00000000 00000000 00000000 00000110  a&b   :00000000 00000000 00000000 00000100  a|b   :00000000 00000000 00000000 00001111   ~a   :11111111 11111111 11111111 11110010  a^b   :00000000 00000000 00000000 00001011  a<<2  :00000000 00000000 00000000 00110100   -a   :11111111 11111111 11111111 11110011  a>>2  :00000000 00000000 00000000 00000011(-a)>>2 :11111111 11111111 11111111 11111100  a>>>2 :00000000 00000000 00000000 00000011(-a)>>>2:00111111 11111111 11111111 11111100

  如有疑问欢迎提出,如有错误欢迎指正。

  转载请注明本文地址:https://www.cnblogs.com/yqxx1116/p/11657307.html

原文地址:https://www.cnblogs.com/yqxx1116/p/11657307.html

时间: 2024-11-09 01:59:22

原码、反码、补码与位运算的相关文章

C语言原码反码补码与位运算.

目录: 一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算的运算说明     七.位运算的简单应用   一.机器数和真值 机器数(computer number)是数字在计算机中的二进制表示形式 机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制 比如:十进制中的+6,计算机字长为8位,转换成二进制就是00000110,如果是-6,就是10000110

[C++基础]原码/反码/补码、二进制位运算

原码/反码/补码 编码 定义 实例 原码 最高位为符号位,"0"表示正,"1"表示负,其余位表示数值的大小. [+100]原=01100100 [+0]原=00000000 [-100]原=11100100 [-0]原=10000000注意:在原码中,零有两种表示形式. 反码 正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外. [+100]反=01100100 [+0]反=00000000 [-100]反=10011011[-0]反=1111111

关于原码反码补码以及位元算

首先人脑能识别的,也就是我们常写的就是原码,因为数字都有正负之分所以,二进制的时候用最高位表示正负,0为正,1为负,例如3二进制位00000011,-3二进制位10000011. 反码:正数的反码等于其本身,负数的反码:符号位不变其他位取反.(00000011)原=(00000011)反,(10000011)原=(11111100)反,为什么会有反码呐,因为用原码进行计算的时候: 比如3-3=3+(-3)=(00000011)原+(10000011)原=10000110=134,就会出现这样的误

关于 原码 反码 补码 位运算

二进制 原码:最高位为符号位,0为正  1为负 正数的原码 反码 补码 都是相同的 反码:负数的反码为原码符号位不变 其它对应变化(1变0 0变1) 补码:等于 反码+1 3^-3 =? 运算过程 -3 10000000 00000000 00000000 00000011 原码 11111111 11111111 11111111 11111100 反码 先求得-3的补码 11111111 11111111 11111111 11111101 补码 得到3的补码 00000000 000000

&lt;13&gt;【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 //定义10进制数,打印出10.8.16进制的值 6 int a = 13; 7 printf("%d\n",a); 8 printf("%o\n",a); 9 printf("%x\n",a); 10 11 //int 64 4个字节 12 int b = 0b0000000000000000

java原码,反码,补码 位运算

原码是什么?反码是什么?补码是什么? 原码:正数:正数转换为二进制位就是这个正数的原码负数:负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 int 2 原码: 00000000 00000000 00000000 00000010 int -2 原码:10000000 00000000 00000000 00000010 00000000 00000000 00000000 00000011 # 3原码10000000 00000000 00000000 00000011 # -3原

原码, 反码, 补码 详解以及负数的按位与运算

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算

原码, 反码, 补码 详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

[转]原码, 反码, 补码 详解 很全

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计

关于原码, 反码, 补码的复习

原本大一时考试90+的组成原理,隔了太长时间没使用,概念也慢慢模糊了,由于最近考试的基础知识有可能用到,于是,在网上找些资料,整理成这个文章,方便以后某天回来看看,好记性真不如烂笔头. 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如