算法学习——位运算

老大最近让我撸算法,并且为了持之以恒,每周搞一篇吧,先把前几周的亮一亮,比较简单好理解。


位运算

<<和>>都是两个非常有用的东西,目前我所接触到的比较有用的地方是以下几种:

1. 计算2的三次方

计算1:2*2*2 

计算2:1<<3   

0000 0001      >>>>>>       0000 1000

这个一目了然,计算2比计算1快很多,不过计算2需要理解一下,位左移的时候将会把后面多余的补零。

其实写完整是这样的 1 * 2^3  可以写成  1<<3  , 为什么这样? 因为二进制呀!你乘以三次2,不就是进位三次嘛。

那以后记住吧:x * 2^n  可以写成 x << n 。


2.位运算存储

这个是用来节省空间的,因为当时幻想着希望做出一个新的压缩算法,然而老大让我去好好看看算法书,接触到了哈夫曼算法。

其实道理很简单,一个8位的char能存多少种字符? 答案是127- (-128)对吧,只看正整数的情况下我们了解这是ASCII码,但是呢,很多时候我们不可能用这么多种。

所以了,这么多种类都被浪费了,比如我只存 a  b  c  三种字符,每个都存一个char的情况下,每个要占用8位,其实怎么解决也很简单,看下下面的计算:

          0

     0       1 

0    1    0     1    

到这里,我们从左边开始,000代表a     001代表b   010代表c    011代表"终止"

abc怎么存?

  000        001        010        011            0000

 000a      001b       010c     011终止   0000补位

把这个东西转换成两个char 就可以存到文件中啦,是不是少存了一个字节,量越大越漂亮,存入的就减少好多,这就是哈夫曼压缩的原理,当然如果结合LZ77算法压缩那会得到我们目前市场上使用的主流几款压缩软件)!


3.加密

如果我们用自己编的一段 0010 0000与所有位进行异或计算,那就实现了加密!

解密的这段编码只有你自己知道。

你甚至可以读取一个计算机的机器码,与你的钥匙进行一个异或计算,然后得到一段数字,这段数字就是这个软件的解密id,设计软件的时候要把读取机器码和解密算法写到程序里面,以防止别人拷贝程序使用。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值