chapter 3-6

文章目录

  • 3.检测两个整数是否有相反的符号
  • 4.计算整数的绝对值(abs)而不使用分支
  • 5.计算两个整数的最小值或最大值而不使用分支
  • 6.确定一个整数是否是2的幂

3.检测两个整数是否有相反的符号

//检测两个整数是否有相反的符号
int x, y;               // 要比较符号的输入值
bool f = ((x ^ y) < 0); // 当且仅当 x 和 y 有相反的符号时为 true

4.计算整数的绝对值(abs)而不使用分支

int v;           // 我们要找到 v 的绝对值
unsigned int r;  // 结果存储在这里
int const mask = v >> sizeof(int) * CHAR_BIT - 1;r = (v + mask) ^ mask;
专利变体:
r = (v ^ mask) - mask;

在某些计算机上,没有整数绝对值指令(或者编译器未使用它们)。在分支操作昂贵的机器上,上述表达式可能比明显的方法更快,即 r = (v < 0) ? -(unsigned)v : v,尽管操作的数量相同。
在2003年3月7日,Angus Duggan指出,1989年的ANSI C规范将有符号右移的结果定义为特定实现,因此在某些系统上这种技巧可能不起作用。我已经阅读到,ANSI C不要求值以二进制补码形式表示,所以可能由于这个原因在某些使用一的补码的旧机器上也不起作用。在2004年3月14日,Keith H. Duggar向我发送了上述的专利变体,它优于我最初想出的这个表达式,r = (+1 | (v >> (sizeof(int) * CHAR_BIT - 1))) * v,因为没有使用乘法。不幸的是,这种方法在2000年6月6日由Vladimir Yu Volkonsky获得了美国专利,并由Sun Microsystems分配。在2006年8月13日,Yuriy Kaminskiy告诉我,该专利可能无效,因为该方法在专利申请之前就已被发布,例如在1996年11月9日Agner Fog的《如何为Pentium处理器进行优化》中。Yuriy还提到,这份文件在1997年已经翻译成俄语,Vladimir可能已经阅读了。此外,互联网档案馆也有一个与之相关的旧链接。在2007年1月30日,Peter Kankowski与我分享了一个由Microsoft的Visual C++编译器输出启发的abs版本。它在这里作为主要解决方案展示。在2007年12月6日,Hai Jin抱怨说结果是有符号的,因此当计算最小值的绝对值时,它仍然是负数。在2008年4月15日,Andrew Shapira指出,明显的方法可能会溢出,因为它当时缺少(unsigned)类型转换;为了最大的可移植性,他建议使用(v < 0)?(1 + ((unsigned)(-1-v))):(unsigned)v。但是在2008年7月9日,Vincent Lefèvre引用ISO C99规范说服我删除它,因为即使在非二进制补码的机器上,-(unsigned)v也会得到正确的结果。对-(unsigned)v的求值首先将v的负值通过添加2N转换为无符号值,得到了我称之为U的2s补码表示。然后,U被否定,得到了所需的结果,-U = 0 - U = 2N - U = 2N - (v+2N) = -v = abs(v)。

5.计算两个整数的最小值或最大值而不使用分支

int x;  // 我们要找到 x 和 y 的最小值
int y;
int r;  // 结果存储在这里r = y ^ ((x ^ y) & -(x < y)); // 最小值(min(x, y))

这段代码用于找到整数 x 和 y 的最小值,将结果存储在 r 中。它不使用分支语句,而是使用位运算来实现。这种方法可以在一些极少数的机器上比明显的方法更快,即 r = (x < y) ? x : y,即使它涉及两个额外的指令。通常来说,明显的方法是最好的。这种方法之所以有效,是因为如果 x < y,则 -(x < y) 将全部是1,所以 r = y ^ (x ^ y) & ~0 = y ^ x ^ y = x。否则,如果 x >= y,则 -(x < y) 将全部是0,所以 r = y ^ ((x ^ y) & 0) = y。

要计算最大值,只需使用以下代码:

r = x ^ ((x ^ y) & -(x < y)); // 最大值(max(x, y))

还有一种快速且不太精确的版本,如果你知道 INT_MIN <= x - y <= INT_MAX,则可以使用以下方法,因为 (x - y) 只需评估一次:

r = y + ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // 最小值(min(x, y))
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // 最大值(max(x, y))

需要注意,1989 ANSI C 规范没有明确定义有符号右移的结果,所以这些代码不是可移植的。如果溢出会引发异常,那么 x 和 y 的值应为无符号或应该在做减法时转换为无符号,以避免不必要的异常,但右移需要有符号操作数以在负数时产生全1位。

这段代码有一些限制和不确定性,需要小心使用,并且可能不适用于所有情况

6.确定一个整数是否是2的幂

unsigned int v; // 我们要确定 v 是否是2的幂
bool f;         // 结果存储在这里f = (v & (v - 1)) == 0;

需要注意的是,这段代码会错误地将0视为2的幂。如果要避免这种情况,可以使用以下修改的版本:

f = v && !(v & (v - 1));

这个修改版会排除0,只有正整数且是2的幂的情况才会被视为是2的幂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/122964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载音频项目

加我微信hezkz17进数字音频系统研究开发交流答疑群(课题组) ー 1&#xff0e;负责此项目的音频链路的设计及其实现 在ADSP21375上实现音频链路的处理。如噪声门&#xff0c;压限器&#xff0c;高低通&#xff0c;PEQ、各种效果等。 2&#xff0e;负责DSP与MCU端SPI协议实现。M…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

【操作系统】进程的控制和通信

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果 一. 实验目的 &#xff08;1&#xff09;加深对进程概念的理解&#xff0c;进一步认识并发执行的实质。 &#xff08;2&#xff09;掌握Linux 操作系统中进程的创建和终止操作。 &#xff08;3&#xff09;理解进程…

计算机网络-应用层(2)

一、DHCP 当需要跨越多个网段提供DHCP 服务时必须使用DHCP 中继代理&#xff0c; 就是在DHCP 客户和服务器之间转发DHCP 消息的主机或路由器。 DHCP 服务端使用UDP 的67号端口来监听和接收客户请求消息&#xff0c; 保留UDP 的68号端口用于接收来自DHCP 服务器的消息回复。 在…

C#中对于using的使用方式

导入命名空间 使用list需要导入 System.Collections.Generic;这个命名空间 using System.Collections.Generic; using UnityEngine;public class UsingTest : MonoBehaviour {void Start(){List<int> intlist new List<int>();} }省略类名 using UnityEngine; …

基于 Python 的豆瓣电影分析、可视化系统,附源码

文章目录 1 简介2 技术栈具体实现1.设计豆瓣电影自动化爬虫程序&#xff0c;自动获取电影数据2.对爬取到的数据进行清洗和预处理&#xff0c;包括多维度数据字段清洗和扩充3.将清洗好的数据存储到MySQL数据库中 4 具体效果图5 推荐阅读 1 简介 基于Python flask 的豆瓣电影分析…

win11 右键菜单默认 显示更多选项

win10升级至win11后&#xff0c;一个很大的变化就是右键菜单&#xff0c;其不再显示所有的菜单项&#xff0c;而是默认只显示主要的几项&#xff0c;点击“显示更多选项”后&#xff0c;才会显示所有菜单项。 这对于经常需要用到右键其他菜单项的人来说明&#xff0c;非常的不…

自定义控件测量尺寸(onMeasure()方法的实现)

1.测量模式 Android的视图提供了三种测量模式&#xff1a; (1)MeasureSpec.AT_MOST 达到最大值&#xff0c;即match_parent。 (2)MeasureSpec.UNSPECIFIED 未指定&#xff08;实际就是自适应&#xff09;&#xff0c;即wrap_content。 (3)MeasureSpec.EXACTLY 精确尺寸&…

【C++】C++入门(下)--内联函数 auto关键字 nullptr

目录 一 内联函数 1 内联函数概念和定义 2 内联函数特性 二 auto关键字 1 auto概念 2 auto 的使用细则 (1) auto与指针和引用结合起来使用 (2) 在同一行定义多个变量 3 auto不能推导的场景 (1) auto不能作为函数的参数 (2) auto不能直接用来声明数组 4 基于范围的fo…

关于深度学习中Attention的一些简单理解

Attention 机制 Attention应用在了很多最流行的模型中&#xff0c;Transformer、BERT、GPT等等。 Attention就是计算一个加权平均&#xff1b;通过加权平均的权值来自计算每个隐藏层之间的相关度&#xff1b; 示例 Attention 机制 Attention应用在了很多最流行的模型中&am…

C# 海康威视平台API接入 和网页摄像头部署

文章目录 前言相关网址综合安防管理平台网址获取Appkey和Secret/密码和密钥测试个人魔改工具类 海康视频接入获取摄像头Id下载海康Web插件原生Html导入网页设置 JS封装封装代码使用设置成功&#xff01; 前言 最近有个需求是将海康的摄像头视频画面传到我们平台上&#xff0c;…

代码随想录算法训练营第23期day34 |860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

目录 一、&#xff08;leetcode 860&#xff09;柠檬水找零 二、&#xff08;leetcode 406&#xff09;根据身高重建队列 三、&#xff08;leetcode 452&#xff09;用最少数量的箭引爆气球 一、&#xff08;leetcode 860&#xff09;柠檬水找零 力扣题目链接 状态&#xf…

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…

FL Studio21.2演示版下载

FL Studio 21.2 带有 stem 分离和 FL Cloud&#xff0c;这是一项专为 FL Studio 打造的具有里程碑意义的新服务。其他新功能包括 FL Studio Fruity Edition 的 Audio Clips&#xff08;音频剪辑&#xff09;和一个新的模拟建模合成器 Kepler。 为庆祝 FL Studio 21.2 的发布&am…

Vue实现首页导航和左侧菜单,介绍mock.js并实现登录注册间的跳转,实现左侧栏折叠效果,优化Main.vue组件,使用mock.js生成随机响应数据

目录 1. mockjs 1.1 mockjs介绍 1.2 mockjs使用步骤 1.2.1 安装mockjs依赖 1.2.2 在项目中引入mockjs 1.2.3 创建目录和文件 1.2.4 为每个组件准备模拟数据 1.2.5 测试 1.2.6 前端调试 1.2.7 mockjs生成随机响应数据 1.2.8 根据不同响应&#xff0c;给出不同提示 2…

二进制搭建 Kubernetes+部署网络组件+部署CornDNS+负载均衡部署+部署Dashboard

二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;20.0.0.50 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;20.0.0.100k8s集群node01&#xff1a;20.0.0.110 kubelet kube-proxy docker etcd k8s集群node02&#xff1a;20.…

如何通过adb控制安卓手机wifi

一、准备工作 1、先用USB数据线 将手机和电脑连接在一起 1&#xff09; 数据线连接手机和电脑&#xff0c;选择“传输文件”的连接方式&#xff1b; 2&#xff09; 在手机上&#xff0c;打开“开发者选项”、“USB调试”&#xff1b; 2、在电脑上安装adb工具&#xff0c;参考…

MySQL(2):环境搭建

1.软件下载 软装去官网下载&#xff08;社区版&#xff09;&#xff1a;https://downloads.mysql.com/archives/installer/&#xff08;历史版本可选&#xff09; 选择下面的&#xff0c;一步到位 2.软件安装 双击 .msi 文件 选完 Custom 自定义后点 next 按 1&#xff0c…

软通动力:打造AI第二增长曲线,图谋新发展

【科技明说 &#xff5c; 重磅专题】 软通动力对于AI的想法还是比较久了&#xff0c;之前在与业内朋友聊到软通动力之时&#xff0c;曾提到软通动力的根基还是在于其多年来的软件服务能力&#xff0c;目前借助AI技术创新的机遇将软件服务能力进一步放大&#xff0c;扩展到更多行…

人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵结…