feat(Go-Tool):
2021/02/23:删除linq包使用示例,修改二进制工具与单测类,修改lomuto划分,修改前缀树与单测类,修改时间比较工具
This commit is contained in:
@@ -13,7 +13,8 @@ import (
|
||||
//判断num的二进制表示某个位置是否为1
|
||||
func JudgeOneWithPosition(num int, position int) bool {
|
||||
if position < 1 {
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,"+
|
||||
"当前出入的Position为%d", position))
|
||||
}
|
||||
return num&(1<<uint(position-1)) != 0
|
||||
}
|
||||
@@ -30,16 +31,17 @@ func JudgeIfOdd(num int) bool {
|
||||
|
||||
//判断一个数的二进制形式是否只有一个位置为1,这个方法可以用来判断是不是2的n次方
|
||||
func JudgeOnlyOneBitWithOne(num int) bool {
|
||||
//解析:num & (num -1) 当num为2的N次方的时候, 2N次方 & (2N次方 - 1) ,因为做了最高位的右移(2N次方只有一个1,2N次方-1除了2N次方的那一个1的位置为0,其他都为1)
|
||||
//所以&的结果就是 0 ,而0 & 2N次方一定是0,所以如果结果是0,那么一定是2N次方,只有一个位置有1
|
||||
//那么 num & (num -1) 当num不是2的N次方的时候,他的结果原来有1的最高位置,一定为1,所以再和num进行 & 操作的时候,结果也一定是大于0,所以不止一个1
|
||||
return num&(num&(num-1)) == 0
|
||||
if num == 0 {
|
||||
return false
|
||||
}
|
||||
return num&(num-1) == 0
|
||||
}
|
||||
|
||||
//设置num的某一个位置为1,如果原来就是1的话,就不发生变化
|
||||
func SetOneByPosition(num int, position int) int {
|
||||
if position < 1 {
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,"+
|
||||
"当前出入的Position为%d", position))
|
||||
}
|
||||
return num | (1 << uint(position-1))
|
||||
}
|
||||
@@ -52,7 +54,8 @@ func JudgeWithEqualSymbol(num1 int, num2 int) bool {
|
||||
//设置某一个数num的二进制Position位为0
|
||||
func SetZeroBuPosition(num int, position int) int {
|
||||
if position < 1 {
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
|
||||
panic(fmt.Sprintf("输入有误:Position不能小于1,"+
|
||||
"当前出入的Position为%d", position))
|
||||
}
|
||||
return num &^ (1 << uint(position-1))
|
||||
}
|
||||
|
||||
@@ -102,12 +102,9 @@ func TestJudgeIfEven(t *testing.T) {
|
||||
|
||||
func TestJudgeOnlyOneBitWithOne(t *testing.T) {
|
||||
fmt.Println("判断二进制表示是不是只有一个位为1")
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(1))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(2))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(3))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(4))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(56))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(64))
|
||||
for i := 0; i <= 32; i++ {
|
||||
fmt.Println(fmt.Sprintf("%d是不是2的n次方,结果为%v", i, JudgeOnlyOneBitWithOne(i)))
|
||||
}
|
||||
fmt.Println()
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(-1))
|
||||
fmt.Println(JudgeOnlyOneBitWithOne(-2))
|
||||
|
||||
Reference in New Issue
Block a user