zoukankan      html  css  js  c++  java
  • python学习特辑——二进制和位运算篇

    以前学习java的时候,二进制和位运算只停留在"懂"的程度,从来没有花时间去推导和总结,作为一个数学系的学生,一直想花点时间做推理证明

    java和python关于二进制和位运算的规则差不多,这次就当是补偿

    一、符号约定                                                                                                      

    ⌊p⌋:比p小的最大整数,称为向下取整

    ⌈p⌉:比 p大的最小整数,称为向上取整

    xix在二进制下的第i位数  

    二、二进制表示                                                                                                  

    截取的  这位博主 的图,推导过程使用求和公式来计算,思路差不多

    n这样理解:使得10n <= x 的最大的n值,bi的取值是一个集合

     三、移位运算<< 和 >>                                                                                                            

    1、x,⌊x/2⌋,2x在二进制之间的关系

    2、推导结论

    结论一:x << k = 2kx

    结论二:  x >> k = ⌊x/2k⌋ 

    结论三:二进制的递推公式,这里理解下即可,python中用bin(n)函数可以直接打出n的二进制,如bin(123)打印为 0b1111011   

    这点同java的

    Integer.toBinaryString(n),结果也是以0b开头

    四、按位运算                                                                                                           

    位运算符只能适用于整数,总体运算规则为:

      首先把整数转换为二进制表示形式,按最低位对齐,短的高位补0,然后进行位运算,最后把得到的二进制转换为十进制结果

    以下四种:&,|,^,~,分别是与,或,异或,取反

    具体的例子就不说了,记几个思路清奇的应用

    1、判断奇偶数

    def isodd(x):
     return True if (x & 1) else False

    2、求下标x和y的中间值

    比如二分查找中的mid = (low+high) // 2 = (low+high) >>1

    3、异或运算交换a和b的值

    a ^= b
    b ^= a
    a ^= b

     4、异或运算找出单身汉

    在2N+1个自然数中,有N个数均出现2次,找出只出现1次的那个自然数

    方案:所有数做异或计算,最终的结果就是要找的那个数

  • 相关阅读:
    我的第一个java程序
    ==和equals的区别
    后缀数组题目总结
    后缀数组入门
    【POJ.3415 Common Substrings】后缀数组 长度不小于K的公共子串个数
    【UOJ #519 查查查乐乐】 DP
    【CF-1350 D. Orac and Medians】 思维
    【CF-1350 C
    【CF 1350 B.Orac and Models】 DP
    【POJ-2774】Long Long Message 后缀数组 最长公共子串(出现两次不重叠子串)
  • 原文地址:https://www.cnblogs.com/yb38156/p/12487390.html
Copyright © 2011-2022 走看看