当前位置: 首页 > news >正文

C语言之按位取反~(七十一)

  1. 计算机存储数据基本知识

  • 计算机中二进制数包括(正数和负数)是以补码形式存储。

  • 符号位:补码的最左侧首位是符号位,0表示正数,1表示负数。

二进制有三种形式:原码、反码、补码。

  • 正数的补码和反码:是正数本身(原码)。

  • 负数的反码:符号位不变(是1),其余位按位取反,不用加一。

  • 负数的补码:符号位不变(是1),先按位取反,再加一。(即是反码加一)

在计算机内存中,负数以补码形式存在(即取反,再加一)。

  • 计算机并不直接存储二进制原码,而是存储二进制的补码。正数的补码就是原码。比如1,原码0000 0001,补码也为0000 0001。就存储的是原码0000 00001.

  • 而计算机不直接存储负数,而是存储负数的补码,负数的补码计算规则是"符号位不变,原码取反再加一"。

例如:-1怎么存储的?

原码1000 0001

取反1111 1110,

加一1111 1111

1111 1111就是-1的二进制补码。

当负数要输出给别的程序用的时候怎么办呢?总不能把存储的补码给别人的吧?给人用之前需要将补码逆向再转换成原码,否则数据就不对了。

负数转换补码的规则:取反,再加一,符号不变。

那么:

补码转换原码的规则:符号不变,先减一,再取反。

这样就得到原码,可以输出了。

  1. 将正数和负数按位取反(~)

特别注意:

"~"符号取反的用法,场景也不一样,同样是"~"符号,有的是求反码,有的是求补码,所以要搞清楚。

举两个例子说明:

<1>.代码示例一
#include <stdio.h>int main(){int a = 0;printf("~0 = %d\n",~a);a = 1;printf("~1 = %d\n",~a);a = 2;printf("~2 = %d\n",~a);a = -1;printf("~(-1) = %d\n",~a);a = -2;printf("~(-2) = %d\n",~a);
}

打印:

~0 = -1
~1 = -2
~2 = -3
~(-1) = 0
~(-2) = 1
  • ~0步骤

步骤1:首先计算出0的补码,即它本身

步骤2:因为0的补码是负数,所以要还原其原码在输出;

0的补码和反码是他本身,再对0按位取反,就变成1111 1111,因为最高位为1,所以为负数,负数是以补码的形式存储,所以输出时要转换成正确的原码。

因为原码转补码的规则是:先取反,再加一

所以补码转原码的规则是:先减一,再取反。

步骤1:首先计算出0的补码,即它本身
0的原码的补码是他本身:
0000 0000步骤2:因为0的补码是负数,所以要还原其原码在输出
~0:即所有位数,按位取反
1111 1111当你要输出的时候,编译器发现最高位符号位是1,这个数是个负数,而负数在计算机里面是用补码存储的,所以此时计算机认为这个1111 1111是补码,它要转换成原码输出,于是先减去1,除了符号位不变,其他位全部取反。因为原码转补码的规则是:先取反,再加一
所以补码转原码的规则是:先减一,再取反。
减一操作:
1111 1110取反操作
1000 0001 = -1

  • ~1步骤

步骤1:首先计算出1的补码,即它本身

步骤2:因为1的补码是负数,所以要还原其原码在输出;

因为原码转补码的规则是:先取反,再加一

所以补码转原码的规则是:先减一,再取反。

步骤1:首先计算出1的补码,即它本身
1的原码的补码是他本身:
0000 0001步骤2:因为1的补码是负数,所以要还原其原码在输出;
~1的反码:即所有位数,按位取反
1111 1110如果要输出打印,此时编译器发现其为最高位为1,是个负数,负数在计算机里面是用补码存储的,所以此时计算机认为这个1111 1110是补码,它要转换成原码输出,于是先减去1,除了符号位不变,其他位全部取反。减一操作:
1111 1101取反操作
1000 0010 = -2
  • ~(-1)步骤

步骤1:首先计算出-1的补码(因为负数在计算机中以补码形式存在)

步骤2:再对-1的补码按位取反

步骤1:首先计算出-1的补码
-1的原码:
1000 0001-1的反码:即按位取反(负号不变)
1111 1110加一
1111 1111步骤2:再对-1的补码按位取反,包括符号位
~(1111 1111) =0000 0000 = 0 
  • ~(-2)步骤

步骤1:首先计算出-2的补码因为负数在计算机中以补码形式存在)

步骤2:再对-2的补码按位取反

步骤1:首先计算出-2的补码因为负数在计算机中以补码形式存在)
-2的原码:
1000 0010-2的反码:即按位取反(负号不变)
1111 1101加一
1111 1110步骤2:再对-2的补码按位取反
0000 0001 = 1

<2>.代码示例二:按位取反参与多项运算
#include <stdio.h>  int flag = 0x104; //0000 0001 0000 0100  int flag2 = 0x04;printf("flag2 = %#x\n",flag2);printf("~flag2 = %#x\n",~flag2);int b = flag & ~flag2;printf("b = %#x\n",b);return 0;
}

打印:

flag2 = 0x4
~flag2 = 0xfffffffb
b = 0x100

  • 求flag & ~flag2
1.flag = 0x104
二进制原码:
0000 0001 0000 0100  2.flag2 = 0x04
二进制原码:
0000 0000 0000 0100~flag2(按位取反):
1111 1111 1111 1011flag与上flag2的反码0000 0001 0000 0100  1111 1111 1111 1011
=    0000 0001 0000 0000 = 0x100所以b = 0x100,和计算机打印的一样。

相关文章:

C语言之按位取反~(七十一)

计算机存储数据基本知识计算机中二进制数包括&#xff08;正数和负数&#xff09;是以补码形式存储。符号位&#xff1a;补码的最左侧首位是符号位&#xff0c;0表示正数&#xff0c;1表示负数。二进制有三种形式&#xff1a;原码、反码、补码。正数的补码和反码&#xff1a;是…...

C# 委托

Action 在 C# 中&#xff0c;Action 是一个预定义的委托类型&#xff0c;表示一个不带参数和返回值的方法。它的定义如下&#xff1a; public delegate void Action();Action 委托可以用于表示任何没有参数和返回值的方法。例如&#xff1a; // 定义一个不带参数和返回值的方…...

leetcode究极刷题笔记(11~15)

&#xff08;11&#xff09;盛最多水的容器&#xff08;中等&#xff09; 实现思路&#xff1a; 定义两个指针&#xff08;a,b&#xff09;&#xff0c;分别指向数组的前后位置&#xff0c;如果此时a的值小于b的话&#xff0c;就将a右移一位&#xff0c;如果此时b指向的值小于…...

【C语言】一篇带你从零了解 枚举

文章目录什么是枚举枚举类型的定义枚举的优点枚举的使用什么是枚举 枚举是 C 语言中的一种基本数据类型 可以让数据更简洁&#xff0c;更易读。 枚举顾名思义就是 一 一 列举。 把可能的取值 一 一列举。 比如我们现实生活中&#xff1a; 一周的星期一到星期日是有限的7天&…...

用Pytorch搭建一个房价预测模型

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 目录 一、项目介绍 二、准备工作 三、实验过程 3.1数据预处理 3.2拆分数据集 3.3构建PyTorch模型 3.3.1.数据转换 3.3.2定义模型架构 3.3.3定义损失准则和优化器 3.3.4创建…...

《Netty》从零开始学netty源码(十五)之ServerSocketChannel

在NioServerSocketChannel中调用newChannel方法创建java原生的channel&#xff0c;过程如下&#xff1a; ServerSocketChannel是一个抽象类&#xff0c;WEPollSelectorProvider调用openServerSocketChannel方法创建的是它的实现类ServerSocketChannelImpl&#xff0c;类结构如下…...

Java stream性能比较

环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17CPU&#xff1a;8核 ➜ ~ cat /proc/cpuinfo | egrep -ie physical id|cpu cores physical id : 0 cpu cores : 1 physical id : 2 cpu cores : 1 physical id : 4 cpu cores : 1 physical id : 6 cpu cores : 1 physical id …...

【数据结构与算法】设计循环队列

文章目录&#x1f451;前言如何设计循环队列设计循环队列整体的代码&#x1f4ef;写在最后&#x1f451;前言 &#x1f6a9;前面我们 用队列实现了一个栈 &#xff0c;用栈实现了一个队列 &#xff0c;相信大家随随便便轻松拿捏&#xff0c;而本章将带大家上点难度&#xff0c;…...

最新版!国内IT软件外包公司汇总~

金三银四已经过去一半&#xff0c;再过几个月又将迎来毕业季&#xff0c;大家有没有找到心仪的工作机会呀&#xff1f;有很多同学说今年的金三银四似乎不存在了。小李&#xff1a;今年的金三银四变成了铜三铁四&#xff0c;不断地投递又不断地造拒。小王&#xff1a;大量已读不…...

MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?

关于数据库中行数统计&#xff0c;无论是MySQL还是Oracle&#xff0c;都有一个函数可以使用&#xff0c;那就是COUNT 但是&#xff0c;就是这个常用的COUNT函数&#xff0c;却暗藏着很多玄机&#xff0c;尤其是在面试的时候&#xff0c;一不小心就会被虐。不信的话请尝试回答下…...

数位DP 详解及其案例实战 [模板+技巧+案例]

零. 案例引入 1.案例引入 leetcode233. 数字 1 的个数 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 输入&#xff1a;n 13 输出&#xff1a;6 2.暴力解 对于上述的案例&#xff0c;暴力解肯定是可行的&#xff0c;但时间复杂度较高,对…...

并发编程(六)—AbstractExecutorService源码分析

一、AbstractExecutorService简介AbstractExecutorService是一个抽象类&#xff0c;实现了ExecutorService接口&#xff0c;提供了线程池的基本实现。它是Java Executor框架的核心类&#xff0c;提供了线程池的基本操作&#xff0c;如提交任务、管理线程池、执行任务等。自定义…...

015行为型-职责链模式

目录定义标准模式实现&#xff1a;职责链变体使用链表实现使用数组实现应用场景日志输出spring过滤器spirng 拦截器mybatis动态sql定义 责链模式是一种设计模式&#xff0c;其目的是使多个对象能够处理同一请求&#xff0c;但是并不知道下一个处理请求的对象是谁。它能够解耦请…...

python例程:五子棋(控制台版)程序

目录《五子棋&#xff08;控制台版&#xff09;》程序使用说明程序示例代码可执行程序及源码下载路径《五子棋&#xff08;控制台版&#xff09;》程序使用说明 在PyCharm中运行《五子棋&#xff08;控制台版&#xff09;》即可进入如图1所示的系统主界面。 图1 游戏主界面 具…...

leveldb的Compaction线程

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 1. leveldb的Compaction全局线程 在leveldb中&#xff0c;有一个全局的后台线程BGThread&#xff0c;用于数据库的MinorCompact与MajorCompact。 重点关注“全局线程”&#xff1a; 这个标识着无论一个进程打开…...

邪恶的想法冒出,立马启动python实现美女通通下

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 完整源码、python资料: 点击此处跳转文末名片获取 当我在首页刷到这些的时候~ 我的心里逐渐浮现一个邪念&#xff1a;我把这些小姐姐全都采集&#xff0c;可以嘛&#xff1f; 答案当然是可以的~毕竟就我这技术&#xff0c…...

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…...

经典算法面试题——Java篇-附带赠书活动,评论区随机选取一人赠书

目录 一.图书推荐 二.说一下什么是二分法&#xff1f;使用二分法时需要注意什么&#xff1f;如何用代码实现&#xff1f; 三.什么是插入排序&#xff1f;用代码如何实现&#xff1f; 四.什么是冒泡排序&#xff1f;用代码如何实现&#xff1f; 五.什么是斐波那契数列&#…...

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了

支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了 熟悉RT-Thread和瑞萨MCU的朋友都知道&#xff0c;当前RT-Thread仓库的主线代码是不支持RA2E1这个BSP的。刚好&#xff0c;最近我在联合瑞萨推广一个叫《致敬未来的攻城狮计划》&#xff0c;使用的就是RA2E1开发板&…...

【C语言进阶】 12. 假期测评①

day01 1. 转义字符的判断 以下不正确的定义语句是&#xff08; &#xff09; A: double x[5] {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] {‘\x10’, ‘\xa’, ‘\8’}; C: char c1[] {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[53]{0, 1, 3, 5, 7, 9}; 【答案解析】 B 本…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...