十进制数转二进制数
十进制转二进制,即把十进制数m除以2,得到商和余数,记录下余数,用商继续除以2得到商和余数,如此循环直至商为0后,把所有的余数倒叙排列即为二进制数。具体如下:
十进制数123
123/2=61,123%2=1
61/2=30,61%2=1
30/2=15,30%2=0
15/2=7,15%2=1
7/2=3,7%2=1
3/2=1,3%2=1
1/2=0,1%2=1
得到的二进制数为所有的取模数倒叙排列:
1111011`
十进制数转八进制数
十进制转八进制,即把十进制数m除以8,得到商和余数,记录下余数,
用商继续除以8得到商和余数,如此循环直至商为0后,把所有的余数倒叙排列即为八进制数。具体如下:
十进制数678
678/8=84,678%8=6
84/8=10,84%8=4
10/8=1,10%8=2
1/8=0,1%8=1
得到的八进制数为所有的取模数倒叙排列:
1246`
十进制数转十六进制数
十进制转十六进制,即把十进制数m除以16,得到商和余数,记录下余数,
用商继续除以16得到商和余数,如此循环直至商为0后,把所有的余数倒叙排列即为十六进制数。具体如下:
十进制数8912
8912/16=557,8912%16=0
557/16=34,557%16=13
34/16=2,34%16=2
2/16=0,2%16=2
得到的十六进制数为所有的取模数倒叙排列:
22D0`
golang算法实现
package main
import (
"fmt"
"strconv"
)
const (
hex_a = 10 + iota
hex_b
hex_c
hex_d
hex_e
hex_f
)
// 将十进制数字转化为二进制字符串
func convertToAny(num int, size int) string {
s := ""
if size != 2 && size != 8 && size != 16 {
panic("传入进制位数异常")
}
if num == 0 {
return "0"
}
hexMap := map[int]string{hex_a: "A", hex_b: "B", hex_c: "C", hex_d: "D", hex_e: "E", hex_f: "F"}
for ; num > 0; num /= size {
lsb := num % size
if 16 == size && lsb > 9 {
s = hexMap[lsb] + s
} else {
// strconv.Itoa() 将数字强制性转化为字符串
s = strconv.Itoa(lsb) + s
}
}
return s
}
func main() {
fmt.Println(
convertToAny(2, 2),
convertToAny(31, 16),
convertToAny(15, 8),
convertToAny(0, 2),
)
}
位运算应用
设置功能开关复选框
- 判断某一功能是否启用
level & 功能代码 不为0表示启用,为0标识未启用
//28= 4 + 8 +16
var a = 28 & 3
fmt.Println(a)
if ((c.getLevel() & b.getCode()) > 0) {
checkSum += Integer.parseInt(String.valueOf(b.getCode()));
}
- 设置生效
level = level | 功能代码
- 设置不生效
level = level & ~功能代码 (~为取反)
按位取反之后返回一个每个 bit 位都取反的数,对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反。例如:
func main() {
var a int8 = 3
var b uint8 = 3
var c int8 = -3
fmt.Printf("^%b=%b %d\n", a, ^a, ^a) // ^11=-100 -4
fmt.Printf("^%b=%b %d\n", b, ^b, ^b) // ^11=11111100 252
fmt.Printf("^%b=%b %d\n", c, ^c, ^c) // ^-11=10 2
}