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

2024-06-22 04:18

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

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

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

算法说明

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

如果CPU表示有符号数使用的是反码(one’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 + mask) ^ mask;return result;
}

算法计算过程

第一步,计算mask

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

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

第二步,计算val + mask

如果是正数,val + mask = val

如果是负数,val + mask = val - 1

第三步,异或mask

如果是正数,val ^ mask = val ^ 0= val,异或0还是等于数本身。

如果是负数,(val - 1) ^ mask = (val - 1) ^ 0xFFFFFFFF,结果就是val的值减一再取反,得到正数。因为负数使用的是补码,补码要得到对应的正数的补码就是减一再取反。

计算示例

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

mask = 85 >> 31 = 0
val + mask = 85 + 0 = 85
(val + mask) ^ mask = 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 = -1
val + mask = -85 + -1 = -86
(val + mask) ^ mask = 851111 1111 1111 1111 1111 1111 1010 1010
^   1111 1111 1111 1111 1111 1111 1111 1111
-------------------------------------------0000 0000 0000 0000 0000 0000 0101 0101

[参考资料]

Bit Twiddling Hacks By Sean Eron Anderson

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


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

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



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

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用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