feat(Go-Tool):2020/12/7 :更新bit位操作工作 BitTool
This commit is contained in:
@@ -62,6 +62,8 @@
|
|||||||
|
|
||||||
2020/11/25:完善linq包使用示例
|
2020/11/25:完善linq包使用示例
|
||||||
|
|
||||||
|
2020/12/7 :更新bit位操作工作 BitTool
|
||||||
|
|
||||||
# mod vendor模式加载包
|
# mod vendor模式加载包
|
||||||
通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到
|
通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
@@ -20,39 +20,58 @@ import (
|
|||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
|
|
||||||
//Aggregate() //自定义聚合操作
|
Aggregate() //自定义聚合操作
|
||||||
|
|
||||||
//All() //判断数组的所有元素是否都满足条件
|
All() //判断数组的所有元素是否都满足条件
|
||||||
|
|
||||||
//AnyWith() //判断数组是否有任意个元素满足条件
|
Where() //根据条件查询对应的元素
|
||||||
|
|
||||||
//Calculate() //这个方法只能计算数值类型
|
AnyWith() //判断数组是否有任意个元素满足条件
|
||||||
|
|
||||||
//Combine() //组合两个数组的两种方式
|
Calculate() //这个方法只能计算数值类型
|
||||||
|
|
||||||
//Distinct() //返回数组中唯一的元素
|
Combine() //组合两个数组的两种方式
|
||||||
|
|
||||||
//Except() //返回第一个序列没有出现在第二个序列中的成员
|
Contains() //包含
|
||||||
|
|
||||||
//GroupBy() //按照对应规则进行分组
|
FirstAndLast() //第一个和最后一个
|
||||||
|
|
||||||
//Intersect() //产生两个数组的交集
|
Distinct() //返回数组中唯一的元素
|
||||||
|
|
||||||
//Join() //对两个有关联的数据进行处理
|
Except() //返回第一个序列没有出现在第二个序列中的成员
|
||||||
|
|
||||||
//OrderBy() //排序
|
GroupBy() //按照对应规则进行分组
|
||||||
|
|
||||||
//Select() //筛选结构体中对应的元素
|
Intersect() //产生两个数组的交集
|
||||||
|
|
||||||
//SelectMany() //对多维数组进行合并或者其他处理 对结构体中的数组进行处理(与结构体结合操作)
|
OrderBy() //排序
|
||||||
|
|
||||||
//Skip() //略过指定条件的元素
|
Skip() //略过指定条件的元素
|
||||||
|
|
||||||
//Count() //计算数组总长度
|
Count() //计算数组总长度
|
||||||
|
|
||||||
//Result() //对结果集进行操作
|
Result() //对结果集进行操作
|
||||||
|
|
||||||
Take() //获取对应数量的元素,一般多用在排序后前几个的元素
|
Take() //获取对应数量的元素,一般多用在排序后前几个的元素
|
||||||
|
|
||||||
|
Select() //筛选结构体中对应的元素
|
||||||
|
|
||||||
|
SelectMany() //对多维数组进行合并或者其他处理 对结构体中的数组进行处理(与结构体结合操作)
|
||||||
|
|
||||||
|
Join() //对两个有关联的数据进行处理
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func Where() {
|
||||||
|
bookList := MakeBook()
|
||||||
|
query := linq.From(bookList)
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println()
|
||||||
|
query.WhereT(func(book Book) bool {
|
||||||
|
return book.Money > float64(70)
|
||||||
|
}).ForEachT(func(book Book) {
|
||||||
|
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func Take() {
|
func Take() {
|
||||||
@@ -82,6 +101,16 @@ func Take() {
|
|||||||
}).Take(-2).ForEachT(func(book Book) {
|
}).Take(-2).ForEachT(func(book Book) {
|
||||||
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name))
|
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
//TakeWhile系列的方法,虽然能够根据条件进行查询,但是有一个弊端就是一旦查询到的结果和条件不符合则直接返回,也就是说后面满足条件的元素不会再被做筛选
|
||||||
|
//那么比如这边的这个大于的操作,就需要对整个数组进行排序之后然后进行筛选,如果不希望排序,则用原生的for循环可能会更好
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println()
|
||||||
|
query.TakeWhileT(func(book Book) bool {
|
||||||
|
return book.Money > float64(70)
|
||||||
|
}).ForEachT(func(book Book) {
|
||||||
|
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", book.Author, book.Name))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func Result() {
|
func Result() {
|
||||||
@@ -136,6 +165,16 @@ func Result() {
|
|||||||
for key, value := range bookMap2 {
|
for key, value := range bookMap2 {
|
||||||
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", key, value.Name))
|
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", key, value.Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println()
|
||||||
|
bookListResult := make([]Book, 0)
|
||||||
|
linq.From(MakeBook()).OrderByDescendingT(func(book Book) string {
|
||||||
|
return book.Author
|
||||||
|
}).ToSlice(&bookListResult)
|
||||||
|
for _, value := range bookListResult {
|
||||||
|
fmt.Println(fmt.Sprintf("作者%v,写了一本书叫做%v", value.Author, value.Name))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Count() {
|
func Count() {
|
||||||
@@ -430,15 +469,19 @@ func Combine() {
|
|||||||
fmt.Println(fmt.Sprintf("第一个元素是%v", query2.First()))
|
fmt.Println(fmt.Sprintf("第一个元素是%v", query2.First()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func FirstAndLast(query linq.Query) {
|
func FirstAndLast() {
|
||||||
|
bookList := MakeBook()
|
||||||
|
query := linq.From(bookList)
|
||||||
fmt.Println(fmt.Sprintf("数组第一本书书名叫:%s", query.First().(Book).Name))
|
fmt.Println(fmt.Sprintf("数组第一本书书名叫:%s", query.First().(Book).Name))
|
||||||
fmt.Println(fmt.Sprintf("数组第一本书发布时间在2020年1月1号之前的书书名叫:%s", query.FirstWith(PublishTimeBeforeFunc).(Book).Name))
|
fmt.Println(fmt.Sprintf("数组第一本书发布时间在2018年1月1号之后的书书名叫:%s", query.FirstWith(PublishTimeAfterFunc).(Book).Name))
|
||||||
|
|
||||||
fmt.Println(fmt.Sprintf("数组最后一本书书名叫:%s", query.Last().(Book).Name))
|
fmt.Println(fmt.Sprintf("数组最后一本书书名叫:%s", query.Last().(Book).Name))
|
||||||
fmt.Println(fmt.Sprintf("数组最后一本书发布时间在2020年1月1号之前的书书名叫:%s", query.LastWith(PublishTimeBeforeFunc).(Book).Name))
|
fmt.Println(fmt.Sprintf("数组最后一本书发布时间在2018年1月1号之后的书书名叫:%s", query.LastWith(PublishTimeAfterFunc).(Book).Name))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Contains(query linq.Query) {
|
func Contains() {
|
||||||
|
bookList := MakeBook()
|
||||||
|
query := linq.From(bookList)
|
||||||
//这边需要注意是的是如果要判断两个元素是否相等,在go里面不能使用元素的地址
|
//这边需要注意是的是如果要判断两个元素是否相等,在go里面不能使用元素的地址
|
||||||
// 所以这边加到query里面的必须不能是元素的地址,否则没办法比较结构体本身,而是比较结构体的地址
|
// 所以这边加到query里面的必须不能是元素的地址,否则没办法比较结构体本身,而是比较结构体的地址
|
||||||
fmt.Println(fmt.Sprintf("判断当前数组是否包含相同的元素,判断的是所有的值,而不是地址,结果是%v", query.Contains(Book{
|
fmt.Println(fmt.Sprintf("判断当前数组是否包含相同的元素,判断的是所有的值,而不是地址,结果是%v", query.Contains(Book{
|
||||||
|
|||||||
Reference in New Issue
Block a user