不用任何比较运算符找出两个整数中的较大的值

简介: 不用任何比较运算符找出两个整数中的较大的值

这是 牛客网的一道面试题

给定两个32位整数a和b,返回a和b中较大的,要求不能用任何比较判断运算符。


如果可以用标注库, 那首先想到可以用sort包进行排序:

package main
import (
  "fmt"
  "sort"
)
func main() {
  var a, b = 123, 126
  sli := make([]int, 0)
  sli = append(sli, a, b)
  sort.Ints(sli)
  fmt.Println("其中较大的数为:", sli[1])
}

但一般情况下,不会让使用sort包。


另一种思路:

a和b做差,如果能得知差的正负号,则也可以得出a,b谁大谁小

(未考虑a-b可能溢出的情况)

package main
import "fmt"
func main() {
  var a, b = 123, 126
  c := a - b
  scA := sign(c)
  scB := flip(scA)
  fmt.Println("较大的数为:", a*scA+b*scB)
}
// 取反操作。即异或操作 (位取反也称位异或,一般用~或者^。Go用后者);  当两数不同时,结果为1;两数相同时,结果为0
func flip(n int) int {
  return n ^ 1
}
func sign(n int) int {
  return flip((n >> 31) & 1)
}
目录
相关文章
|
6月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
5天前
|
Python
数值运算
数值运算。
16 4
|
3月前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
6月前
求两个整数的较大值
两幅图片展示,无文字描述。第一张图链接源为:[结果](https://so.csdn.net/so/search?q=%E7%BB%93%E6%9E%9C&spm=1001.2101.3001.7020)。
35 1
求两个整数的较大值
|
6月前
60.编程统计数组a中正数、0、负数的个数
60.编程统计数组a中正数、0、负数的个数
46 0
|
6月前
|
存储 算法 Java
数值问题
数值问题
91 1
|
6月前
|
Python
计算小于或等于n的非负整数区间包含的1的数量
计算小于或等于n的非负整数区间包含的1的数量
60 0
|
存储 Linux Python
0.3-0.7+0.4等于多少?浮点数间慎用比较
0.3-0.7+0.4等于多少?浮点数间慎用比较
wustojc1003设计函数求2个整数的最大值
wustojc1003设计函数求2个整数的最大值
49 0
|
C++
C++ 计算斐波那契数列第100万项的精确整数值
C++ 计算斐波那契数列第100万项的精确整数值
111 0