位运算总结

news/2024/7/3 0:34:48

位运算

  • 有符号整数
  • 无符号整数
  • 位移运算

1计算机中数字的表示

  • 计算机只有0,1两个数字,所以我们常用的10进制计算

  • 所以我们需表示10进制

  • 要使用二进制来表示10进制数

进制表示法

我们假设一个 8 位的数据类型

方案1

2:0000 0010

我们会发现这样无法表示负数

方案2:原码表示法

最高位表示正负(0正1负),剩余7位表示数值

2: 0000 0010

-2:1000 0010

计算2+(-2)

image-20230606102631587

我们发现结果为 1000 0100,翻译为10进制为 -4 ;同样出现了问题

方案三:补码表示法

  • 补码规则:正数的补码与原码一样;负数:对其绝对值按位取反,+1;
  • 反码:符号位不变,其余位数取反(0—>1,1—>0)
  • 补码:反码+1

-3

先计算-3绝对值的二进制 00000011

取反:11111100

加1:11111101(这就是计算级的-3表示)

2. 规则总结(有符号数)

  • 二进制最高位是符号位:0正1负
  • 正数的原码,反码,补码都一样
  • 负数的反码:符号位不败,其余取反
  • 负数的补码:反码+1
  • 0的补码,反码都是0
  • 计算机运算时使用补码来运算

3. 有符号运算案例

1+1

1的补码: 0000 0001

0000 0001+0000 0001=0000 0010 即10进制的2

1-2

  • 将两个数转换为补码

1的补码: 0000 0001

-2 的原码: 1000 0010

-2的反码:1111 1101

-2的补码:1111 1110

1111 1110 +0000 0001=1111 1111

  • 将结果反推回去

先-1 的到反码 1111 1110

在得到原码 1000 0001 即 10进制表示的 -1(答案正确)

位运算

  • 逻辑运算符

    • &:与,
    • ^:异或,无进位加法
    • |:或:有1则为1
  • 位移运算符

    • <<:左移

    image-20230606105719382

    • 在一些特殊情况下 可以当作*2 使用,但是需要注意二者并不等价,比如 我们左移30位 数字正负都会发生变化
    • 规矩这个规则,任意一个10进制数都会变为0,所以当int 左移位数大于等于32位时,会先求余数,在进行左移即
      • 左移32位相当于不移动
      • 33位相当于移动1位
    • >>:右移

    • >>>:无符号右移

      正数

      10 :0000 1010

      10>>2 0000 0010 —>2

      10>>>2 0000 0010—>2

      我们可以发现对于正数而言其结果一样

      负数

      -10 原码 :1000 1010

      ​ 反码:1111 0101

      ​ 补码:1111 0110

      -10 >>2 1111 1101 (取前6位,高位补1) —》变换回原数:-3

      -10 >>2 0011 1101(取前6位,高位补0)—> 195

      负数二者运算结果不一样


http://lihuaxi.xjx100.cn/news/1216009.html

相关文章

(三)CSharp-方法

一、实例字段和局部变量 实例字段局部变量生存期从实例被创建时开始&#xff0c;直到实例不再被访问时结束从它在块中被声明的那一刻开始&#xff0c;在块完成执行时结束隐式初始化初始化成该类型的默认值没有隐式初始化。如果变量在使用之前没有被赋值&#xff0c;编译器就会…

Azure Log Analytics:与Power BI集成

注&#xff1a;本文最初发布于https://d-bi.gitee.io, 2023年6月迁移至CSDN 前述 Azure Log Analytics是Azure Monitor中的一项分析服务。本文将讲述通过Log Analytics与Power BI集成的方式&#xff0c;获取Power BI工作区内的日志信息&#xff0c;包括各PBI数据集的CPU消耗&a…

【Leetcode】51 N皇后

完成过程中的一些问题&#xff1a; 一开始没有审题&#xff0c;只设置了两个数组判断行列上是否有元素&#xff0c;没有考虑斜线的问题。出现了行的重复&#xff0c;对行只需要递归&#xff0c;不需要循环。思路&#xff1a;按行摆放棋子&#xff0c;摆放棋子时检查列上和斜线…

Android 12.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

1.前言 在android12.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析…

2023年6月 国内大语言模型对比【国内模型正在崛起】

先说一下这个文章怎么来的。因为朋友问我大语言模型可以生成公务员面试回答不&#xff0c;我说可以啊。之前看文心有这个服务。我想最近好几个模型也没用了测一把&#xff01;结果&#xff01;大吃一惊&#xff01;我觉得我的三个傻孩子长大了&#xff01;&#xff08;chatglm1…

【28JavaScript 使用误区】避免常见陷阱:JavaScript 使用误区详解,助您写出高质量、可靠的代码

JavaScript 使用误区 在学习和使用 JavaScript 的过程中&#xff0c;很容易陷入一些常见的误区。这些误区可能导致代码出错、性能下降或安全漏洞。本文将帮助您识别并避免这些常见的 JavaScript 使用误区。 1. 不加分号的后果 在 JavaScript 中&#xff0c;每条语句的结尾应…

VSCode+GDB+Qemu调试ARM64 linux内核

俗话说&#xff0c;工欲善其事 必先利其器。linux kernel是一个非常复杂的系统&#xff0c;初学者会很难入门。 如果有一个方便的调试环境&#xff0c;学习效率至少能有5-10倍的提升。 为了学习linux内核&#xff0c;通常有这两个需要 可以摆脱硬件&#xff0c;方便的编译和…

JavaScript进阶(下)

# JavaScript 进阶 - 第3天笔记 > 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 - 了解面向对象编程的一般特征 - 掌握基于构造函数原型对象的逻辑封装 - 掌握基于原型对…