MST

星途 面试题库

面试题:Go语言中复杂Go整型位运算的实现

给定两个`int`类型的数`a`和`b`,编写一个函数,利用位运算实现不使用`+`、`-`运算符的加法操作,并考虑处理溢出情况,用Go语言实现。
15.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "math"
)

func add(a, b int) (int, bool) {
    for b != 0 {
        carry := a & b
        a = a ^ b
        b = carry << 1
        if a < 0 && b < 0 && a^b >= 0 {
            return 0, true
        }
        if a >= 0 && b >= 0 && a^b < 0 {
            return 0, true
        }
    }
    if (a < 0 && math.Abs(float64(a)) > math.MaxInt32) || (a >= 0 && a > math.MaxInt32) {
        return 0, true
    }
    return a, false
}

你可以这样调用这个函数:

func main() {
    result, overflow := add(10, 20)
    if overflow {
        fmt.Println("发生溢出")
    } else {
        fmt.Printf("结果为: %d\n", result)
    }
}
  1. add函数中,使用for循环来不断计算进位和无进位的和。
    • carry := a & b计算进位,因为只有两个对应位都为1时才会产生进位。
    • a = a ^ b计算无进位的和,因为^运算符在两个对应位不同时为1。
    • b = carry << 1将进位左移一位,作为下一轮循环的b值。
  2. 在循环中,通过判断aba^b的符号来检测是否可能发生溢出。
  3. 循环结束后,再次检查结果a是否超出int类型的范围,如果超出则表示溢出。
  4. main函数中调用add函数,并根据是否溢出输出相应信息。