IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 你一定看得懂的位运算 -> 正文阅读

[C++知识库]你一定看得懂的位运算

本文出自个人博客:https://www.getaoning.com/archives/191

本文尽可能保证与语言无关。

位运算是直接对整数在内存中的二进制位进行操作。

阅读本章时,可以打开计算机上的计算器,并将其设置为程序员模式

了解位

在计算机内部,数据以二进制来存储,每一个二进制数称为一个(Bit)。

位运算

位运算通常有如下几个操作:

  • 位与(&, and),当两位同时为 1 时才返回 1。
  • 位或(|, or),只要有一位为 1 就返回 1。
  • 异或(^, xor),当两位相同时返回 0,不相同时返回 1。
  • 位非(~, not),将操作数的每个位(包括符号位)全部取反。
  • 左移(<<, lsh)
  • 右移(>>, rsh)

其中,Java 语言还多一个无符号右移(>>>)。

位与位或异或的运算法则如下:

操作数 10011
操作数 20101
位与0001
位或0111
异或0110

位与

举个例子,5 & 9 = 1,为什么呢?

首先将这两个数转换成二进制

5: 0000 0000 0000 0000 0000 0000 0000 0101
9: 0000 0000 0000 0000 0000 0000 0000 1001
------------------------------------------
&: 0000 0000 0000 0000 0000 0000 0000 0001 = 1

位或

5 | 9 = 13

5: 0000 0000 0000 0000 0000 0000 0000 0101
9: 0000 0000 0000 0000 0000 0000 0000 1001
------------------------------------------
|: 0000 0000 0000 0000 0000 0000 0000 1101 = 13

异或

5 ^ 9 = 12

5: 0000 0000 0000 0000 0000 0000 0000 0101
9: 0000 0000 0000 0000 0000 0000 0000 1001
------------------------------------------
^: 0000 0000 0000 0000 0000 0000 0000 1100 = 12

位非

~-5 = 4

 -5: 1111 1111 1111 1111 1111 1111 1111 1011 (计算机内部负数以补码形式表示)
~-5: 0000 0000 0000 0000 0000 0000 0000 0100

左移

左移是将操作数二进制码整体向左移动制定的位数,左移后右边空出来的地方用 0 来填充。

5<<2 = 20-5<<2 = -20

      5:    0000 0000 0000 0000 0000 0000 0000 0101
   5<<2: 00 0000 0000 0000 0000 0000 0000 0001 0100
->          0000 0000 0000 0000 0000 0000 0001 0100 = 20
--------------------------------------------------------
     -5:    1111 1111 1111 1111 1111 1111 1111 1011
  -5<<2: 11 1111 1111 1111 1111 1111 1111 1110 1100
->          1111 1111 1111 1111 1111 1111 1110 1100 = -20

右移

右移是将操作数的二进制码向右移动指定位数,右移后左边空出来的地方以原来的符号为来填充。若原来为正数,则在左边补 0,若为负数,则补 1。

5>>2 = 1-5>>2 = -2

     5: 0000 0000 0000 0000 0000 0000 0000 0101
  5>>2:   00 0000 0000 0000 0000 0000 0000 0001 01
->      0000 0000 0000 0000 0000 0000 0000 0001    = 1
------------------------------------------------------
    -5: 1111 1111 1111 1111 1111 1111 1111 1011
 -5>>2:   11 1111 1111 1111 1111 1111 1111 1110 11
->      1111 1111 1111 1111 1111 1111 1111 1110    = -2

Java 中的无符号右移

右移不同,无符号右移无论操作数为正数还是负数都将在左侧补 0。

-5>>>2 = 1073741822

     -5: 1111 1111 1111 1111 1111 1111 1111 1011
 -5>>>2:   11 1111 1111 1111 1111 1111 1111 1110 11
->       0011 1111 1111 1111 1111 1111 1111 1110    = 1073741822
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:21:36  更:2021-09-24 10:22:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:52:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码