如何使用二进制计算乘法?

网站建设4年前发布
59 0 0

你是什么时候注意到位运算?,从毕业入职公司看大佬的代码出现 2 << 4​ 开始?从小白晋升高开读框架的源码看到 MAXIMUM_CAPACITY = 1 << 30; 开始?还是从什么时候开始?,其实二进制的位运算一直在我们那身边,从你开始编写 Hello Word 打印输出时就有二进制流的处理,只不过隐藏的很深不好发现。所以在我们开始意识到代码和二进制的关系往往都是来自于看到可以用二进制完成的计算,包括;二进制计算效率高于乘机,也包括二进制可以更好的体现出你要设置值的大小范围。比如你要设定一个指定范围大小的 Int 值 = 1073741824,那么是给这样一个整数值看起来直观,还是二进制 1<< 30 更直观呢?其实他们两个值是相等的。所以这样的情况下也会有二进制运算的体现。,而小傅哥在学习编程阶段,第一次注意到二进制的运算是关于a、b两个值的互换,如果不引入第三个值就可以完成?,一个 ^ 帽子一样的运算符,就把两个数给替换,替换后 a = 3,b = 2 那它是怎么办到的呢?,^ 异或运算:两个操作数的同位中,如果值相同(都是 0 或者都是 1)则为 0,不同(一个是 0,一个是 1)则为 1,以二进制数据为基础进行运算解析,a = 2 二进制数为 0010、b = 3 二进制数为 0011,a = a ^ b = 0010 ^ 0011 = 0001,b = a ^ b = 0001 ^ 0011 = 0010 = 2,a = a ^ b = 0001 ^ 0010 = 0011 = 3,异或运算的基本定理解析,a = a ^ b,b = a ^ b = a ^ b ^ b = a = 2,a = a ^ b = a ^ a ^ b = b = 3,而二进制的运算魅力还远不至于此,还可以完成奇偶判断、有效位计算、乘法、加法等。这些内容的学习可以让我们研发人员,积累编程逻辑和拓展思维模式。接下来小傅哥就带着大家学习一下。,位操作是程序设计中对位数组或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,位运算的运算速度通常与加法运算相同(仍然快于乘法运算),但是通常功耗较小,因为资源使用减少。,四种基本的位运算包括;与&、或|、非^、异或~,202303061352216310b6718acfdca156d376fdfbd2a25d64d138940,与运算;两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。,或运算;两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。,非运算;两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。,异或运算;如果位为0,结果是1,如果位为1,结果是0,20230306135338232be4661dec12e451e249b1ce971a2e10c928334,目的:获取二进制数字中,指定位置的值。,逻辑:该方法将目标值右移到最右边,即位数组的第0个位置上,如;0001 的二进制形式。之后与 1 进行与操作。如果目标位是1,那么结果就是1,反之结果是0;,20230306135222416149f23a0c85e11d3655fee1e94c2f2418a4997,目的:设置二进制数字中,指定位置的值,逻辑:1 就像一个子弹,左移指定位数到目标位置,如;0010 的二进制形式。与目标值 number 做或运算(把子弹打进去),设置结果并返回。,20230306135338c6d721c75c86c74d44e614291adac3839627f7693,目的:清空二进制数字中,指定位置的值,逻辑:类似于设置位值,把1左移指定位数后取反,从 0010 得到 1101 并与目标值 number 做与&运算,清掉目标位的值。,20230306135224370cf3660bb9be9f34e4487c93ab3fcae378f2839,目的:清空二进制数字中,指定位置的值,逻辑:结合清空clearBit、设置setBit,两个方法将制定位置替换为设置值。,20230306135224e5f216f667fbaa3f76d2366f9b468dddea3d81551,目的:检测 number 是否为偶数,逻辑:检测二进制的最右侧一位,如果是1,那么一定是奇数。所以可以与1做与&运算的结果和0判断。不等于0是奇数,等于0是偶数。,20230306135224152399013e952cee9063633dc8191dd337e9e2567,目的:判断 number 值是否为正数。,逻辑:基于二进制正数最左边的值是0的这个事实,右移31位,和1做与&运算,如果结果等于1为负数,反正为正数。,2023030613522409ea75568a3aaa308af5876438f4442687ce67126,目的:乘以2,逻辑:该方法将原始数字向左移动一位。因此所有位都将乘以2,因此数字本身也将乘以2。,20230306135339b97d2d882826216845278171ccae672f80b3c7363,目的:除以2,逻辑:该方法将原始数字向右移动一位。因此所有位都将除以2,因此数字本身也将除以2,且不会产生余数。,20230306135226491f0e4425739bd6301183a9cc1a65bd20c58f838,目的:正数转负数,负数转正数,逻辑:通过二进制异或运算取反,如 1000 = 8 取反 1.....0111 = -9 + 1 = -8,20230306135226274783251ec9d63c6028284a52e6c4d6e582cb179,目的:计算有符号二进制乘积,公式:推到公式与代码向对应,逻辑:乘数a不断左移、乘数b不断右移。当b归0时,a左移累计下来的值就是乘积总和。如图,20230306135226851e59f044b939b8c6b217a7686bbbb8107248597,目的:计算无符号二进制乘积,公式:,逻辑:每个数字都可以表示成一系列2的幂之和。例如 13 的二进制是 1101,最右侧第1位1,是2的0次幂,所以对应2的进制值是左移0位。再比如13的右数第3位是1,对应位置值是4也就是2的2次幂,所以对应2的进制值是左移2位。最终把这些值相加就是乘积值。,202303061353407582cd8142ae314e4f04160a31d45935ab4be9892,目的:使用位运算符对一个数字里设置为1的位进行记数,逻辑:把数字每次向右移动1位,然后使用&操作符取出最右边一位的值,1则记数加1,0则不计。,20230306135227451fa8b96c9ca0c65e70433557362dd085fa68754,目的:计算一个数字,转换为另外一个数字,所需要的转换位数。,逻辑:当数字进行XOR异或运算时,结果将是不同位数的数量(即异或的结果中所有被设置为1的位的数量)。,2023030613522845c58f428435cd02d88353b69be3ebc5374074307,目的:计算二进制数值的有效位数,例如 14 = 1110 有效位为4位。,逻辑:通过1不断地左移加和与 number 做对比,只要比number小就累加1位。,2023030613522845b1b6362c4a434ab7a3121314bb7f5639c8e3191,目的:检查number是否为2的幂值。,逻辑:2的幂值形式的数字为2、4、8、16 等,那么可以把一个二进制数进行错位与&运算,如果错位比对都为0,那么就是2的幂数。,20230306135229c9118f644c1eb52438c28702eaa8c312a65500214,目的:计算有符号二进制加法,逻辑:二进制的累加可以对照下计算10进制累加时一样,对应2个数字相加,当有进位的时候记录进位。

© 版权声明

相关文章