补码:先按正数转换,然后取反加1。
要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 0110
按位与、按位或、按位异或(一样为0)(
任何数与0异或,结果都是其本身)、取反
利用异或实现两数交换 a = a ^ b b = b ^ a a = a ^ b;
例题如下
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
numbers[0]=numbers[0]^numbers[1];
numbers[1]=numbers[0]^numbers[1];
numbers[0]=numbers[0]^numbers[1];
return numbers;
}
};
左移>>、右移<<
异或性质:若a^b=c,则a^c=b,即【异或本身就是异或的逆运算】
下面是一道解码题
class Solution {
public:
vector<int> decode(vector<int>& encoded, int first) {
vector<int>ans(encoded.size()+1);
ans[0]=first;
for(int i=1;i<ans.size();++i){
ans[i]=ans[i-1]^encoded[i-1];
}
return ans;
}
};
给定一个数算它变0的步骤
class Solution {
public:
int numberOfSteps (int num) {
//判断num最后1位是否为1,可以用来判断奇偶性
if(!num)return 0;
int i;
for(i=0;num;num>>=1){
i=(num&1)?i+2:++i;
}
return --i;
}
};
二进制转化为十进制
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
int getDecimalValue(ListNode* head) {
int ans=0;
while(head){
ans<<=1;
ans|=head->val;//这个好像是先加然后整体乘2
head=head->next;
}
return ans;
}
};
列出数组的全部子集(没看明白啊)
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> ret;
ret.push_back({});
int size=nums.size();
int subsize=pow(2,size);
int hash=1;
while(hash<subsize){
vector<int> temp;
for(int k=0;k<size;k++) {
int a=1<<k;
if(a&hash) {
temp.push_back(nums[k]);
}
}
ret.push_back(temp);
hash++;
}
return ret;
}
};