[英]Number compliment of base 10 integer in c++
我們給了一個數字,我們必須以二進制形式翻轉它的 0 和 1,翻轉后我們必須寫出翻轉二進制數的結果十進制數。
例如 - 輸入:n = 5 Output: 2 Reason- 5 在二進制中是“101”,二進制中的補碼是“010”,即 base-10 中的 2。
我的嘗試-
#include <iostream>
#include<math.h>
using namespace std;
int main(){
int n;
cin>>n;
int ans=0;
int a2ns=0;
int finalans=0;
int k=0;
int i=0;
int j=0;
while(n!=0){
int bit = n&1;
ans = bit*pow(10,i)+ans;
i++;
n=n>>1;
}
cout<<ans<<endl;
while(ans!=0){
int digit = ans&1;
if(digit==0){
digit =1;
}
else{
digit =0;
}
a2ns = digit*pow(10,i)+a2ns;
j++;
ans = ans>>1;
}
cout<<a2ns<<endl;
while(a2ns!=0){
int digit1 = a2ns%10;
if(digit1==1){
finalans = finalans + pow(2,k);
}
a2ns=a2ns/10;
k++;
}
cout<<finalans;
}
我的輸出 - 235 11101011
1199999995
768
預期輸出 - 235 11101011
00010100
20
就我而言,將二進制數從 1 翻轉到 0 以及從 0 翻轉到 1 時出現錯誤,我的這部分答案有錯誤,而 rest 是正確的。 所以請任何人都可以糾正我在這段代碼中哪里錯了。
你可以簡單地寫這個,假設 T 是一個無符號類型
template< typename T >
T flip( T number ) {
#ifdef __cpp_lib_int_pow2
int numbits = std::bit_width<T>(number);
#else
int numbits = 0;
T tmp = number;
while ( tmp != 0 ) { tmp/=2; numbits++; }
#endif
T mask = ~(T(-1) << numbits);
number = ~number & mask;
return number;
}
std::bit_width<T>()
是一個 C++20 特性,因此宏__cpp_lib_int_pow2
測試它是否存在。
運行測試
void test() {
for ( T j=0; j<10; ++j ) {
std::cout << "value:" << j << " bin:" << binary(j)
<< " flip:" << binary(flip(j)) << std::endl;
}
}
int main() {
test<uint32_t>();
}
產品
value:0 bin:0 flip:0
value:1 bin:1 flip:0
value:2 bin:10 flip:1
value:3 bin:11 flip:0
value:4 bin:100 flip:11
value:5 bin:101 flip:10
value:6 bin:110 flip:1
value:7 bin:111 flip:0
value:8 bin:1000 flip:111
value:9 bin:1001 flip:110
Godbolt: https://godbolt.org/z/Pxjn3cr6o
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.