leetcode-1009. 10進数整数の逆符号ブラシノート(c++)
15429 ワード
前に書く難易度:単純 数学の問題、 テーマの詳細
acコード問題解決の考え方 N=0、1 を返します. Nのバイナリはビット毎に反転し、結果は1であり、2^iを結果に積算する.指数は1を加算します(i++,iは初期に0をとります). 説明:バイナリ(101)を
知識点補足 参考記事 Leetcode——1009.10進数整数の逆符号化——問題解+コード実現 C/C++基礎-原号/逆符号/補符号/ビット操作実現四則演算
、 、
N 。 , 5 "101",11 "1011" , 。 , N = 0 , 。
1 0 0 1。 , "101" "010"。
N, 。
1:
:5
:2
:5 "101", "010", 2 。
2:
:7
:0
:7 "111", "000", 0 。
3:
:10
:5
:10 "1010", "0101", 5 。
:
0 <= N < 10^9
476: 476:https://leetcode-cn.com/problems/number-complement/
acコード
1*2^0 + 0*2^1 + 1*2^2 = 5
に変換するclass Solution
{
public:
int bitwiseComplement(int N)
{
int i = 0, cc = 0, p = 0;
if(N == 0)
return 1;
while(N)
{
cc = !(N&1);
N = N >> 1;
if(cc != 0)
p += pow(2,i);
i++;
}
return p;
}
};
// --
:a & 1 == 1
:a & 1 == 0
// 2
// ( ) 1
n & (n - 1)
//
// = 1
- n = ~n + 1 = ~(n - 1)
// 1
n & (-n)
// n & ~(n - 1)
// 1
n & (n - 1)
//
// :
// :
int add(int a, int b)
{
int add, jin_wei;
while (b != 0) //
{
add = a^b;
jin_wei = (a & b) << 1; //
a = add;
b = jin_wei;
}
return add;
}
//
// :a - b = a + (-b) = a + (~b + 1)
int subtract(int a, int b)
{
return add(a, add(~b, 1));
}
// ) [ ]
// : ,
int multiply(int a, int b)
{
int ans = 0;
while (b)
{
if (b & 1)
ans = add(ans, a);
a = a << 1;
b = b >> 1;
}
return ans;
}
// [ ]
// ( )
int divide(int a, int b)
{
bool neg = (a > 0)^(b > 0);
if (a < 0)
a = -a;
if (b < 0)
b = -b;
if (a < b)
return 0;
int zuoyi;
//zuoyi
for (zuoyi = 0; zuoyi < 32; zuoyi++)
{
if ((b << zuoyi) >= a)
break;
}
//
int shang = 0;
int i;
for (i = 0; i < zuoyi; i++)
{
if ((b << i) > a) // ,
continue;
shang = shang | (1 << i); //
a = a - (b << i); //
}
if (neg)
return -shang;
return shang;
}
//
int divide(int a, int b)
{
int count = 0;
while (a >= b)
{
a = substract(a, b);
count++;
}
return count;
}