位操作leetcode

知识背景
计算机存储形式为二进制,二进制存在三种不同表示形式:原码,反码,补码

原码:从左往右读数,第一位为符号位,0代表正,1表示负
反码:反码是建立在原码的基础上,正数的反码是本身,负数的反码是符号位不变,其余取反!!!!!!
补码:补码也是建立在原码的基础上,正数的补码不变,负数符号位不变,其余取反,然后加1

1的 原码:0000 0001
反码 0000 0001
补码 0000 0001
-1的原码 1000 0001
反码: 1111 1110
补码 1111 1111

按位操作
按位非~:对所有二进制进行直接取反
按位与&:两个二进制数据的对应位都为1时,才为1
按位或|:两个二进制数据的对应位只要一个为1时,就为1
按位异或^(满足交换律与结合略):两个二进制数据的对应位不相同时,才为1

a = 0001 0011 [19]
b = 1000 1010 [-10]
~a=1110 1100 [-108]
a&b=0000 0010 [2]
a|b=1001 1011 [-27]
a^b = 1001 1001 [-25]

按位左移<<:
nums<<i将nums的二进制数进行左移i位
按位右移>>:
nums>>i nums的二进制数进行右移i位
在这里插入图片描述

重点:异或a^0=a, a ^a=0;a ^b ^c = a ^c ^b

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int tem = 0;
        for(int i:nums)
        tem = tem^i;
        return tem;
       
    }
};

异或操作可以用于交换数据,但是前提是两个数据不在同一空间

(x == y) || ((x ^= y), (y ^= x), (x ^= y)) 

参考
深入理解计算机中的原码、补码、反码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值