class Solution {
public:
string bitsett(int num) {
int f = 1;
if (num < 0) {
num = -num;
f = -1;
}
string s = "";
while (num > 0) {
int tmp = num % 2;
char ch = tmp + '0';
s += ch;
num /= 2;
//if (tmp == 0) cnt++;
}
int l = s.length();
if (f < 0) {
for (int i = 1; i < 32 - l; i++) {
s += '0';
}
s += '1';
reverse(s.begin(), s.end());
for (int i = 1; i < s.length(); i++) {
if (s[i] == '0') s[i] = '1';
else if (s[i] == '1') s[i] = '0';
}
for (int i = s.length() - 1; i >= 0; i--) {
if (s[i] == '0') {
s[i] = '1';
break;
}
else {
s[i] = '0';
}
}
}
else {
for (int i = 1; i <= 32 - l; i++) {
s += '0';
}
reverse(s.begin(), s.end());
}
return s;
}
int reverseBits(int num) {
string s = bitsett(num);
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '0') cnt++;
}
if (cnt == 0) return 32;
int maxx = 0;
for (int j = 0; j < cnt; j++) {
int r = -1;
string str = s;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '0') r++;
if (r == j) {
str[i] = '1';
break;
}
}
int m = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '1') m++;
else {
if (m > maxx) maxx = m;
m = 0;
}
}
maxx = max(maxx, m);
}
return maxx;
}
};
主要学到了二进制转换的一些知识。
比如正数以原码形式存放,负数以补码形式存放。其中补码又是以反码加一表示的。至于负数为什么要这样做是为了便于计算机对数据进行直接加法计算。还有终于学会了debug,在vs上,虽然很耗时,但是可以改对。