第2天--编程能力

位运算技巧

1. & 与运算 两个位都是 1 时,结果才为 1,否则为 0,如
1 0 0 1 1
& 1 1 0 0 1
------------------------------
1 0 0 0 1

2. | 或运算 两个位都是 0 时,结果才为 0,否则为 1,如
1 0 0 1 1
| 1 1 0 0 1
------------------------------
1 1 0 1 1

3. ^ 异或运算,两个位相同则为 0,不同则为 1,如
1 0 0 1 1
^ 1 1 0 0 1
-----------------------------
0 1 0 1 0

4. 数 a 向右移一位,相当于将 a 除以 2;数 a 向左移一位,相当于将 a 乘以 2 ,(8,4,2,1)
int a = 2;
a >> 1; —> 1
a << 1; —> 4

5. 位操作判断奇偶数
​只要根据数的最后一位是 0 还是 1 来决定即可,为 0 就是偶数,为 1 就是奇数
if(0 == (a & 1)) {
//偶数

6. 位操作求绝对值整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 31 位得到 0,负数右移 31 位得到 -1,即 0xffffffff),然后根据符号进行相应的操作int abs(int a) {
int i = a >> 31;
return i == 0 ? a : (~a + 1);
}
整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数

7. 位运算:
每一次n=n&n-1就相当于减去了一个最低位的1;
拿0011100举例:
(1).
0011100 - 1=0011011
n=0011011&0011100= 0011000
(2).
0011000 - 1=0010111
n=0010111&0011000=0010000
(3).
0010000 - 1=0001111
n=0001111&0010000= 0000000
x & (x - 1) 用于消去x最后一位的1

位运算参考

问题描述1:位1的个数

描述1

n>>=1 就类似于 n+=1; 等同于
n = n>>1

c++编程

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count=0;
        while(n!=0){
            n=n&(n-1);
            count++;
        }
        return count;
        }
};

python编程

class Solution:
    def hammingWeight(self, n: int) -> int:
        count=0
        while(n!=0):   #while:
            n=n&(n-1)
            count+=1
        return count

问题描述2:1281. 整数的各位积和之差

在这里插入图片描述

%10 表示最后一位
/10 表示除去最后一位(python整除)

c++编程

class Solution {
public:
    int subtractProductAndSum(int n) {
        int sum1=0;
        int sum2=1;
        int m;
        int sum;
        while(n){
           m=n%10;
           sum1+=m;
           sum2*=m;
           n=n/10;
        }
        return sum2-sum1;
    }   
};

python编程

class Solution:
    def subtractProductAndSum(self, n: int) -> int:
        sum2=1   #sum1,sum2=0,1
        sum1=0
        while(n):
            m=n%10
            sum1+=m
            sum2=sum2*m
            n=n//10     #//表示整除
        return sum2-sum1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值