广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c语言原码、反码、补码与位运算的概念是什么
  • 408
分享到

c语言原码、反码、补码与位运算的概念是什么

2024-04-02 19:04:59 408人浏览 薄情痞子
摘要

本文小编为大家详细介绍“C语言原码、反码、补码与位运算的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言原码、反码、补码与位运算的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深

本文小编为大家详细介绍“C语言原码、反码、补码与位运算的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言原码、反码、补码与位运算的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、原码、反码、补码

  计算机只有加法运算器,计算器中存储、计算数据都是补码,正数和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

读到这里,这篇“c语言原码、反码、补码与位运算的概念是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: c语言原码、反码、补码与位运算的概念是什么

本文链接: https://www.lsjlt.com/news/95558.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言原码、反码、补码与位运算的概念是什么
    本文小编为大家详细介绍“c语言原码、反码、补码与位运算的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言原码、反码、补码与位运算的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2022-10-19
  • c语言中数据存储与原码、反码、补码的示例分析
    这篇文章主要介绍了c语言中数据存储与原码、反码、补码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.数据的类型介绍在学习数据储存之前,让我们先认识一下数据类型。以...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作