概述
知识背景
计算机存储形式为二进制,二进制存在三种不同表示形式:原码,反码,补码
原码:从左往右读数,第一位为符号位,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))
参考
深入理解计算机中的原码、补码、反码
最后
以上就是彩色鲜花为你收集整理的位操作leetcode的全部内容,希望文章能够帮你解决位操作leetcode所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复