Day7 作业与位运算技巧

2019-01-02  本文已影响0人  ChiAo1fei

作业

  1. # 1
    num1 = int(input('请输入一个整数:'))
    if num1 & 1:
        print(num1,'是奇数')
    else:
        print(num1,'是偶数')
    
  2. 2
    表达式0x13&0x17的值是(19 )
    0x13 = 19 = 0b10011   0x17 = 23 = 0b10111
    0b10011 & 0b10111 = 0x10011 = 19
    
  3. # 3
    若x=-20,y=3则x&y的结果是(0 )
    -20 = 0b110100(原) = 0b101011(反) = 0b101100(补)
    3 = 0b000011(补码)
    x & y = 0b101100 & 0b000011 = 0b000000(补) = 0
    print(-20 & 3)
    
  4. 4
    表达式 -97 | 120 的运算结果是(-1)
    -97 = 0b11100001(原) = 0b10011111(补)
    120 = 0b01111000(补)
    0b10011111 | 0b01111000 = 0b1111111(补) = 0b1000001
    print(-97 | 120)
    
  5. 在位运算中,操作数每右移一位,其结果相当于(B )
    A.操作数乘以2
    B.操作数除以2
    C.操作数除以4
    D.操作数乘以4

6.设x 是一个整数(16位).若要通过x|y使x低度8位置1,高8位不变,则y的二进制数是(00001111 )
​ 或运算 高八位不变则y的高八位的每一位分别是0000低八位为1111则y=00001111

位运算技巧总结

  1. 不使用 + 完成加法

    def add(num1,num2):
        sum = 0
        carry = 0
        # 循环  结果相加直到进位为0
        while num2 != 0:
            # 将两个数异或,模拟加法中相加不进位
            sum = num1 ^ num2
            # 只考虑进位
            carry = (num1 & num2) << 1
            num1 = sum
            num2 = carry
        return sum
    print(add(1,3))
    
  2. 交换两数的值

    a = 12
    b = 13
    a = a ^ b
    b = b ^ a
    a = a ^ b
    print(a,b)
    
  3. 取绝对值

    n = -25
    n = (n ^ (n >> 31)) - (n >> 31)
    print(n)
    
  4. 取最大值

    a = 25
    b = 96
    n = b &((a -b) >> 31) | a & (~(a - b) >> 31)
    print(n)
    
  5. 取最小值

    a = 25
    b = 96
    n = a &((a -b) >> 31) | b & (~(a - b) >> 31)
    print(n)
    
  6. 从低位到高位 取n的第m位

    n = 0b111000
    m = 1
    print(n)
    bit1 = n >> (m - 1) & 1
    print(bit1)
    
  7. 从低位到高位 将n的第m位置1

    n = n | (1 << (m - 1))
    print(bin(n))
    
  8. 从低位到高位 将n的第m位置0

    n = n & ~(1 << (m - 1))
    print(bin(n))
    
上一篇 下一篇

猜你喜欢

热点阅读