对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
给定两个整数a和b,请返回较大的数。
测试样例:
1,2
返回:2
不用分析了,直接给代码,我第一次没有仔细读题,实际上用了判断的,解法1作为参考,解法2是正确答案。
解法一(结果正确,但是不符合题意):
class Compare {
public:
int getMax(int a, int b) {
if(a < 0 && b > 0)
return b;
if(a > 0 && b < 0)
return a;
bool native = a < 0 ? true : false;
unsigned int test = 1 << 30; //直接到符号为下一位,一次性移位30,不用while()...<<=1这样子
int res = a;
for(int i=0; i<30; ++i){
if((test&a) != 0 && (test&b) == 0)
break;
else if((test&b) != 0 && (test&a) == 0){
res = b;
break;
test >>= 1;
return native ? (res == a ? b : a) : res;
class Compare {
public:
int getMax(int a, int b) {
int c = a - b;
int sa = sign(a);
int sb = sign(b);
int sc = sign(c);
int diffab = sa ^ sb;
int sameab = filp(diffab);
int returnA = sameab * sc + diffab * sa;
int returnB = filp(returnA);
return returnA * a + returnB * b;
private:
int sign(int n){
return filp((n >> 31) & 1); //注意这里有一次filp,因为正数为1
int filp(int n){
return n ^ 1;
解法二真正没有使用比较,仅仅是通过正负符号来判断。如果同号,a-b的符号可以作为判断条件,且不会溢出。如果异号,通过表达式returnA * a + returnB * b的互斥特性,必然有一个负数符号为0,就返回了另外一个数。
数值比较器的定义及功能 在数字系统中,特别是在计算机中都具有运算功能,一种简单的运算就是比较两个数A和B的大小。数值比较器就是对两数A、B进行比较,以判断其大小的逻辑电路。比较结果有A>B、A<B以及A=B三种情况。 1.1位数值比较器 1位数值比较器是多位比较器的基础。当A和B都是1位数时,它们只能取0或1两种值,由此可写出1位数值比较器的真值表: 500)this.style.width=500;"> 由真值表得到如下逻辑表达式: 500)this.style.width=500;"> 由以上逻辑表达式可画出如下图所示的逻辑电路。实际应用中,可根据具体情况选用逻辑门。 50
Golang浮点数比较和运算会出现误差。
浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。
package main
import (
errors
github.com/shopspring/decimal
func FloatCompare(f1, f2 interface{}) (n int, err error) {
var f1Dec, f2Dec decimal.Decimal
switch f1.(type) {
case float64:
f1Dec = decim
要比较 a 和 b 的大小,因为不能用比较符号,我们可以通过 a - b 的符号位来判断,如果 a - b 的符号位是 1,说明 a - b < 0,则 a 小,否则 a 大或者 a 和 b 相等。得到一个值,如果这个值是 1 ,说明 a 小,否则 a 大或者 a 和 b 相等。的值绝对不会溢出,那么就看 c 的符号(c为正返回a,c为负返回b)当符号位是 1 的时候,返回 0,符号位是 0 的时候,返回 1。),如果得到 1,则这个数是负数,如果得到 0,则这个数是正数。
想了一下,其实就是题目怪了一点,难度其实并不高。这个题目让我想起了前两年看到的题目,只给你加法,怎么计算加减乘除(都说了到底是哪家公司才会出这种没营养的题目)。相比起来,这题好歹是考了计算机中的加法器,而本文主题中谈论的题目则真的...
前面整理了位运算技巧顺便说了一些题目,还有一些题目没有整理,今天就对我知道的一些在进行整理。
1、不用任何比较判断两个数的大小
给定两个32位整数 a 和 b,要求不使用任何比较判断,返回 a 和 b 中较大的数。
a 和 b 的较大值,如果 a - b &gt; 0 则 a 大,否则 b 大。而结果的正负值我们通过最高位的状态是能知道的。我们假设最大值 x = am + bn,如果a-b&gt;...
文章目录不用任何比较判断找出两个数中较大的数题目代码只用位运算不用算术运算实现整数的加减乘除运算题目代码整数的二进制表达中有多少个1题目代码在其他数都出现偶数次的数组中找到出现奇数次的数题目代码在其他数都出现k次的数组中找到只出现一次的数题目代码后记
不用任何比较判断找出两个数中较大的数
给定两个32位整数a和b,返回a和b中较大的数。
要求:不用任何比较判断
#include<...