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

编程新手必看:彻底理解!与~的取反操作

在编程和计算机科学的语境中,!~ 都是取反操作符,但它们的应用方式和效果存在显著的区别。下面将从定义、应用场景、作用原理及示例等方面对 !~ 进行详细解析。

一、定义

  1. !(逻辑非运算符)

    在C语言、Java等多数编程语言中,! 是一个逻辑非运算符,用于对布尔值(或可以隐式转换为布尔值的表达式)进行取反操作。当操作数为真(即非零值)时,! 运算符的结果为假(即0);反之,当操作数为假(即0)时,! 运算符的结果为真(即非零值,但具体值可能因语言而异,如在C语言中为1)。

  2. ~(按位取反运算符)

    ~ 是一个按位取反运算符,它作用于整数类型的数值,将数值的二进制表示中的每一位进行取反操作,即0变为1,1变为0。需要注意的是,按位取反运算通常是在补码形式下进行的,这意味着对于负数,其取反操作的结果可能会与直观理解有所不同,因为涉及到符号位的翻转和可能的整数溢出。

二、应用场景

  1. ! 的应用场景

    • 布尔值取反:在条件判断、循环控制等场景中,用于反转布尔表达式的值。
    • 隐式类型转换:在某些情况下,! 会将其操作数隐式转换为布尔值,然后进行取反操作。这种转换规则因语言而异,但通常非零值被视为真,零值被视为假。
  2. ~ 的应用场景

    • 位操作:在需要对整数进行位级操作的场景中,如位掩码、位旋转、位计数等,~ 运算符扮演着重要角色。
    • 特定算法实现:在某些特定的算法实现中,如哈希函数、加密算法等,~ 运算符可能被用于生成特定的位模式或执行复杂的位运算。

三、作用原理

  1. ! 的作用原理

    ! 运算符通过检查其操作数的布尔值来决定返回的结果。如果操作数为真(非零),则返回假(0);如果操作数为假(0),则返回真(非零,具体值依语言而定)。这个过程中可能涉及到隐式类型转换,即将非布尔类型的操作数转换为布尔类型。

  2. ~ 的作用原理

    ~ 运算符通过对其操作数的二进制表示进行逐位取反来得到结果。这个操作是在补码形式下进行的,因此对于负数来说,其取反结果可能会超出原始类型的表示范围,导致溢出。此外,由于符号位的翻转,负数的取反结果可能会变得难以直观理解,因为需要考虑到补码表示法和可能的整数溢出问题。

四、示例

以C语言为例,以下示例展示了 !~ 运算符的使用和效果:

#include <stdio.h>  int main() {  int a = 0, b = 5, c = -10;  // ! 的使用示例  int result_a = !a; // 0 变为 1  int result_b = !b; // 非0值(5)变为 0  printf("!a = %d, !b = %d\n", result_a, result_b);  // ~ 的使用示例  int result_c = ~c; // -10 的二进制表示取反(注意是补码形式),结果可能超出 int 范围  // 由于 -10 的补码表示(在 32 位系统中)取反后得到的结果可能是一个大整数(负数),这里只展示基本用法  printf("~c 的原始二进制取反结果可能难以直接显示,但在某些上下文中会有特定效果\n");  // 为了简化理解,这里演示一个正数的按位取反  unsigned int positive_num = 5; // 无符号整数,避免负数取反的复杂性  int result_positive = ~(int)positive_num; // 强制类型转换后进行按位取反  printf("~((int)5) = %d\n", result_positive); // 结果依赖于整数类型和位宽  return 0;  
}

注意:由于 -10 的取反结果涉及到补码表示和可能的整数溢出,因此在实际输出时可能无法直接显示为一个直观的整数值。此外,为了简化理解,示例中演示了一个正数的按位取反操作。

我会以“时”为尺,丈量自己的进步,用“嘉”言“嘉”行,努力珍惜时间,向着她一步步迈进!(眼中闪烁着坚定的光芒,透露出对未来的决心和期待)

respect!

相关文章:

  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • 职场英语培训柯桥外语学校学外语学英语到银泰泓畅学校
  • 【Python学习手册(第四版)】学习笔记19-函数的高级话题
  • 虚拟机macos安装brew、llvm并使用cmake构建项目
  • vue3前端开发-小兔鲜项目-添加购物车操作第一步
  • 59.螺旋矩阵II54.螺旋矩阵
  • Langchain框架深度剖析:解锁大模型-RAG技术的无限潜能,引领AI应用新纪元
  • css水波浪动画效果
  • (回溯) LeetCode 46. 全排列
  • 如何用 CocosCreator 对接抖音小游戏的侧边栏复访
  • 排查MAC地址是否冲突——arping工具详解
  • MySQL中的索引——适合创建索引的情况
  • rknn yolo系列之量化前预处理,解决量化精度低以及出现类似未作nms的很多框子的问题
  • 在js中实现两个对象合并,若重复以第一个对象中的数据为准
  • 【机器学习】卷积神经网络简介
  • Apache的80端口被占用以及访问时报错403
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git初体验
  • JavaWeb(学习笔记二)
  • Java小白进阶笔记(3)-初级面向对象
  • Laravel5.4 Queues队列学习
  • Linux各目录及每个目录的详细介绍
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spring-boot List转Page
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何编写一个可升级的智能合约
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序填坑清单
  • 我有几个粽子,和一个故事
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​​​【收录 Hello 算法】9.4 小结
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (计算机网络)物理层
  • (全注解开发)学习Spring-MVC的第三天
  • (学习日记)2024.01.09
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 分布式技术比较
  • .net 获取某一天 在当月是 第几周 函数
  • .net 受管制代码
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @requestBody写与不写的情况
  • [ 数据结构 - C++] AVL树原理及实现
  • [12] 使用 CUDA 进行图像处理