簡體   English   中英

c++ 中 10 integer 的補數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM