计算不带分支的整数绝对值(abs)

如果一个数字是正的,我们不需要做任何事情。我们只想改变负数。因为负数存储在 2的补语 形式,为了得到一个负数的绝对值,我们必须切换数字的位,并在结果中加1。 例如,8位系统中的-2按如下方式存储,其中最左边的位是符号位。要获得负数的绝对值,我们必须切换所有位,并将1添加到切换的数字,即0 0 0 0 0 1+1将给出1 1 1 0的绝对值。还要记住,只有当数字为负数(设置了符号位)时,我们才需要执行这些操作。 方法1 1) 将掩码设置为整数的右移31(假设使用32位存储整数)。

null
 mask = n>>31 

2) 对于负数,上述步骤将掩码设置为1,正数设置为0。将掩码添加到给定的数字。

 mask + n 

3) mask+n和mask的异或给出绝对值。

 (mask + n)^mask 

实施:

C++

#include <bits/stdc++.h>
using namespace std;
#define CHARBIT 8
/* This function will return absolute value of n*/
unsigned int getAbs( int n)
{
int const mask = n >> ( sizeof ( int ) * CHARBIT - 1);
return ((n + mask) ^ mask);
}
/* Driver program to test above function */
int main()
{
int n = -6;
cout << "Absolute value of " << n << " is " << getAbs(n);
return 0;
}
// This code is contributed by rathbhupendra


C

#include <stdio.h>
#define CHAR_BIT 8
/* This function will return absolute value of n*/
unsigned int getAbs( int n)
{
int const mask = n >> ( sizeof ( int ) * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
/* Driver program to test above function */
int main()
{
int n = -6;
printf ( "Absolute value of %d is %u" , n, getAbs(n));
getchar ();
return 0;
}


JAVA

// Java implementation of above approach
class GFG {
static final int CHAR_BIT = 8 ;
static final int SIZE_INT = 8 ;
/* This function will return absolute value of n*/
static int getAbs( int n)
{
int mask = n >> (SIZE_INT * CHAR_BIT - 1 );
return ((n + mask) ^ mask);
}
/* Driver code */
public static void main(String[] args)
{
int n = - 6 ;
System.out.print( "Absolute value of " + n + " is " + getAbs(n));
}
}
// This code is contributed by Rajput-Ji


蟒蛇3

# Python3 implementation of above approach
CHARBIT = 8 ;
SIZE_INT = 8 ;
# This function will return
# absolute value of n
def getAbs(n):
mask = n >> (SIZE_INT * CHARBIT - 1 );
return ((n + mask) ^ mask);
# Driver Code
n = - 6 ;
print ( "Absolute value of" ,n, "is" ,getAbs(n));
# This code is contributed by mits


C#

// C# implementation of above approach
using System;
class GFG {
static int CHAR_BIT = 8;
static int SIZE_INT = 8;
/* This function will return absolute value of n*/
static int getAbs( int n)
{
int mask = n >> (SIZE_INT * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
/* Driver code */
static void Main()
{
int n = -6;
Console.Write( "Absolute value of " + n + " is " + getAbs(n));
}
}
// This code is contributed by mits


PHP

<?php
// PHP implementation of above approach
$CHARBIT = 8;
$SIZE_INT = 8;
// This function will return
// absolute value of n
function getAbs( $n )
{
global $SIZE_INT , $CHARBIT ;
$mask = $n >> ( $SIZE_INT * $CHARBIT - 1);
return (( $n + $mask ) ^ $mask );
}
// Driver Code
$n = -6;
echo "Absolute value of " . $n .
" is " . getAbs( $n );
// This code is contributed by mits
?>


Javascript

<script>
// javascript implementation of above approach
var CHAR_BIT = 8;
var SIZE_INT = 8;
/* This function will return absolute value of n */
function getAbs(n)
{
var mask = n >> (SIZE_INT * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
/* Driver code */
var n = -6;
document.write( "Absolute value of " + n + " is " + getAbs(n));
// This code is contributed by shikhasingrajput
</script>


输出:

Absolute value of -6 is 6

方法2: 1) 将掩码设置为整数的右移31(假设使用32位存储整数)。

 mask = n>>31 

2) 用数字对面具进行异或运算

 mask ^ n 

3) 从第2步的结果中减去掩码并返回结果。

 (mask^n) - mask 

实施:

C

/* This function will return absolute value of n*/
unsigned int getAbs( int n)
{
int const mask = n >> ( sizeof ( int ) * CHAR_BIT - 1);
return ((n ^ mask) - mask);
}


JAVA

// Java implementation of above approach
class GFG {
/* This function will return absolute value of n*/
static int getAbs( int n)
{
int mask = n >> (SIZE_INT * CHAR_BIT - 1 );
return ((n + mask) ^ mask);
}
}
// This code is contributed by code_hunt.


C#

// C# implementation of above approach
using System;
public class GFG {
static int CHAR_BIT = 8;
static int SIZE_INT = 8;
/* This function will return absolute value of n*/
static int getAbs( int n)
{
int mask = n >> (SIZE_INT * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}
}
// This code is contributed by Rajput-Ji


在分支代价高昂的机器上,上面的表达式可能比明显的方法r=(v<0)更快-(未签名)v:v,即使操作数相同。 请看 有关上述两种方法的更多详细信息。 如果您发现上述任何解释/算法不正确,或发现解决同一问题的更好方法,请写下评论。 参考资料: http://graphics.stanford.edu/~seander/bithacks。html#可积分

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享