【位操作笔记】计算整数的绝对值 3

2024-06-22 04:18

本文主要是介绍【位操作笔记】计算整数的绝对值 3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算整数的绝对值(integer absolute) 3

用于计算整数的绝对值,不使用分支判断。

算法说明

CPU表示有符号数的是使用补码(two’s complement),正数的补码与原码相同;负数的补码,符号位为1,其余位对原码取反加1。

如果CPU表示有符号数使用的是反码(one’s complement),则该算法无效。

因为是使用补码(two’s complement),所以有符号数右移,正数高位补0,负数高位补1,例如一个32位整数,右移31位,正数的结果为0x00000000,负数的结果则为0xFFFFFFFF。

因为算法的结果是带符号的,所以该算法在计算最大的负数时,结果依然会是负的。

实现代码

unsigned int bitabs(int val)
{unsigned int result;int const mask = val >> 31; //val >> (sizeof(int) * 8 - 1)result = val - ((val + val) & mask);return result;
}

或者

unsigned int bitabs(int val)
{unsigned int result;int const mask = val >> 31; //val >> (sizeof(int) * 8 - 1)result = val - ((val << 1) & mask);return result;
}

算法计算过程

第一步,计算mask

如果是正数,mask为0x00000000,既为0

如果是负数,mask为0xFFFFFFFF,既为-1

第二步,计算val + val 或者 val << 1

如果是正数,val + val 或者 val << 1 = 2val ,就是val×2。

如果是负数,val + val 或者 val << 1 = 2val ,就是val×2。

第三步,& mask

如果是正数,2val & mask = 2val & 0x00000000= 0。

如果是负数,2val & mask = 2val & 0xFFFFFFFF = 2val。

第四步,用val减去第三步的结果

如果是正数,val - 0 = val。

如果是负数,val - 2val = -val。

计算示例

假设是85 = 0b 0000 0000 0000 0000 0000 0000 0101 0101

mask = 85 >> 31 = 0val - ((val + val) & mask)
= 85 - ((85 + 85) & 0)
= 85 - (170 & 0)
= 85 - 0
= 85

假设是-85 = 0b 1111 1111 1111 1111 1111 1111 1010 1011

mask = -85 >> 31 = 0b 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFFval - ((val + val) & mask)
= 85 - ((85 + 85) & 0xFFFFFFFF)
= 85 - (170 & 0xFFFFFFFF)
= 85 - 170
= -85

[参考资料]

[Hacker’s Delight] 作者: Henry S. Warren Jr.

Bit Twiddling Hacks By Sean Eron Anderson


本文链接:https://blog.csdn.net/u012028275/article/details/113444575

这篇关于【位操作笔记】计算整数的绝对值 3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083271

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear