关于后端:怎样判断一个数是否为偶数

10次阅读

共计 912 个字符,预计需要花费 3 分钟才能阅读完成。

要求代码行数尽可能少;

package main

import (
    "fmt"
    "strconv"
)

func main(){fmt.Printf("传入的值是否为奇数:%t\n",Judge_is_even(7))


}

func Judge_is_even(num int) bool {//fmt.Println(num % 2)
    rs, _ := strconv.ParseBool(strconv.Itoa(num % 2))
    return rs

}

num % 2, 值为 0 时即无余数, 为偶数; 值为 1 时即余 1, 为奇数;

Go 中泛 int 型无奈间接转换为 bool 类型, 须要先转成 string.. 再由 string 转为 bool


要求性能尽可能高:

思考实质, 用位运算.

一个整数, 无论占 1 个 Byte 还是 2 个或 4 个, 即无论能表征 2 的 8 次方多的整数, 亦或是 2 的 16 次方或 2 的 32 次方多, 但在二进制转十进制中, 其最初一个坑位都是 X * 2 的 0 次方即 X(X 为 0 或 1), 而其下面几位为 0 或 1 乘以 2 的 1 - n 次方, 必为偶数, 故而最初一位 X 为 0 或 1, 即决定了整个整数的奇偶: 如果为 0, 最初一位值为 0 * 2 的 0 次方 =0*1=0, 为偶数; 如果为 1, 则为 1 *1=1, 为奇数;

“ 计算机中的数字通常用二进制补码示意——

如果为负数,补码与原码雷同,间接看最初一位(因为数字 1 的后面 N 位均为 0,跟它做与运算,后面必定为 0),奇数为 1,偶数为 0,与 1 相与,后果不变。

如果为正数,补码转原码:放弃符号位不动,其它各位取反 +1,即为正数的绝对值原码全副取反 +1。还是看最初 1 位,先取反,再 +1,后果还是和原来雷同。进行与运算时还是原来的末位,所以用跟 1 做与运算还是放弃原来的后果。”

奇数的二进制数的最初一位永远是 1,与 1 按位且只会失去 1,偶数相同。

package main

import (
    "fmt"
    "strconv"
)

func main() {fmt.Printf("传入的值是否为奇数:%t\n", Judge_is_even(81))

}

func Judge_is_even(num int) bool {rs, _ := strconv.ParseBool(strconv.Itoa(num & 1))
    return rs

}

可参考

本文由 mdnice 多平台公布

正文完
 0