十进制转其他进制算法 位运算

十进制数转二进制数

十进制转二进制,即把十进制数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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值