feat(Go-Tool):2020/12/7 :更新bit位操作工作 BitTool

This commit is contained in:
Huangzj
2020-12-07 09:11:05 +08:00
parent 591aaa299a
commit 55d6488fc3
4 changed files with 254 additions and 20 deletions
+58
View File
@@ -0,0 +1,58 @@
/*
* @Author : huangzj
* @Time : 2020/12/3 11:56
* @Description:比特位操作的工作类,主要参考:https://learnku.com/go/t/23460/bit-operation-of-go 实现的工具
*/
package bitOperation
import (
"fmt"
)
//判断num的二进制表示某个位置是否为1
func JudgeOneWithPosition(num int, position int) bool {
if position < 1 {
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
}
return num&(1<<uint(position-1)) != 0
}
//判断num是不是偶数
func JudgeIfEven(num int) bool {
return num&1 == 0
}
//判断是不是奇数
func JudgeIfOdd(num int) bool {
return num&1 != 0
}
//判断一个数的二进制形式是否只有一个位置为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
}
//设置num的某一个位置为1,如果原来就是1的话,就不发生变化
func SetOneByPosition(num int, position int) int {
if position < 1 {
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
}
return num | (1 << uint(position-1))
}
//判断两个数字的加减符号是否相同
func JudgeWithEqualSymbol(num1 int, num2 int) bool {
return num1^num2 >= 0
}
//设置某一个数num的二进制Position位为0
func SetZeroBuPosition(num int, position int) int {
if position < 1 {
panic(fmt.Sprintf("输入有误:Position不能小于1,当前出入的Position为%d", position))
}
return num &^ (1 << uint(position-1))
}
+131
View File
@@ -0,0 +1,131 @@
/*
* @Author : huangzj
* @Time : 2020/12/3 14:11
* @Description
*/
package bitOperation
import (
"fmt"
"testing"
)
func TestBitTool(t *testing.T) {
JudgeIfEvenTest()
JudgeIfOddTest()
JudgeOneWithPositionTest()
JudgeOnlyOneBitWithOneTest()
JudgeWithEqualSymbolTest()
SetOneByPositionTest()
SetZeroBuPositionTest()
}
func SetZeroBuPositionTest() {
fmt.Println("设置某个位置上的元素为0")
fmt.Println(fmt.Sprintf("原始: %16b", 1))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(1, 1)))
fmt.Println(fmt.Sprintf("原始: %16b", 10))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(10, 2)))
fmt.Println(fmt.Sprintf("原始: %16b", 20))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(20, 5)))
fmt.Println(fmt.Sprintf("原始: %16b", 101))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(101, 6)))
fmt.Println(fmt.Sprintf("原始: %16b", 20121))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(20121, 8)))
fmt.Println(fmt.Sprintf("原始: %16b", 821331))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(821331, 12)))
fmt.Println(fmt.Sprintf("原始: %16b", 821331))
fmt.Println(fmt.Sprintf("结果:%16b", SetZeroBuPosition(821331, 3)))
fmt.Println()
fmt.Println()
}
func SetOneByPositionTest() {
fmt.Println("设置某个位置上的元素为1")
fmt.Println(fmt.Sprintf("原始: %16b", 2))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(2, 1)))
fmt.Println(fmt.Sprintf("原始: %16b", 10))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(10, 1)))
fmt.Println(fmt.Sprintf("原始: %16b", 20))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(20, 1)))
fmt.Println(fmt.Sprintf("原始: %16b", 101))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(101, 4)))
fmt.Println(fmt.Sprintf("原始: %16b", 20121))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(20121, 6)))
fmt.Println(fmt.Sprintf("原始: %16b", 821331))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(821331, 11)))
fmt.Println(fmt.Sprintf("原始: %16b", 821331))
fmt.Println(fmt.Sprintf("结果:%16b", SetOneByPosition(821331, 2)))
fmt.Println()
fmt.Println()
}
func JudgeWithEqualSymbolTest() {
fmt.Println("判断两个数正负符号是否一致")
fmt.Println(JudgeWithEqualSymbol(10, 20))
fmt.Println(JudgeWithEqualSymbol(10, -20))
fmt.Println(JudgeWithEqualSymbol(-10, -20))
fmt.Println()
fmt.Println()
}
func JudgeOneWithPositionTest() {
fmt.Println("判断二进制表示的某个位上是否为1")
fmt.Println(fmt.Sprintf("%16b", 1))
fmt.Println(JudgeOneWithPosition(1, 1))
fmt.Println(JudgeOneWithPosition(1, 2))
fmt.Println(fmt.Sprintf("%16b", 10))
fmt.Println(JudgeOneWithPosition(10, 2))
fmt.Println(JudgeOneWithPosition(10, 3))
fmt.Println(fmt.Sprintf("%16b", 501))
fmt.Println(JudgeOneWithPosition(501, 7))
fmt.Println(JudgeOneWithPosition(501, 2))
fmt.Println()
fmt.Println()
}
func JudgeIfOddTest() {
fmt.Println("奇数的判断")
fmt.Println(JudgeIfOdd(1))
fmt.Println(JudgeIfOdd(2))
fmt.Println(JudgeIfOdd(101))
fmt.Println(JudgeIfOdd(200))
fmt.Println(JudgeIfOdd(91231))
fmt.Println(JudgeIfOdd(8321312))
fmt.Println()
fmt.Println()
}
func JudgeIfEvenTest() {
fmt.Println("偶数的判断")
fmt.Println(JudgeIfEven(1))
fmt.Println(JudgeIfEven(2))
fmt.Println(JudgeIfEven(101))
fmt.Println(JudgeIfEven(200))
fmt.Println(JudgeIfEven(91231))
fmt.Println(JudgeIfEven(8321312))
fmt.Println()
fmt.Println()
}
func JudgeOnlyOneBitWithOneTest() {
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))
fmt.Println()
fmt.Println(JudgeOnlyOneBitWithOne(-1))
fmt.Println(JudgeOnlyOneBitWithOne(-2))
fmt.Println(JudgeOnlyOneBitWithOne(-3))
fmt.Println(JudgeOnlyOneBitWithOne(-4))
fmt.Println(JudgeOnlyOneBitWithOne(-56))
fmt.Println(JudgeOnlyOneBitWithOne(-64))
fmt.Println()
fmt.Println()
}