如何在c ++中将十进制转换为二进制

时间:2010-01-10 09:26:19

标签: c++

我有一种方法可以将dec转换为bin

QList<bool> widgetInput::decToBin(int number)
{
        int remainder;
        QList<bool> result;
        if(number <= 1) {
            result << number;
            return result;
        }

        remainder = number%2;
        decToBin(number >> 1);
        result << remainder;


}

但遗憾的是,此方法仅在列表中包含一个元素。 但当我用“cout&lt;&lt; number”替换“result&lt;&lt; number”时 它会工作。 你能帮帮我,让我知道我的确切问题在哪里吗?

问候。

5 个答案:

答案 0 :(得分:2)

你非常接近,但你需要进行一次修改:

    remainder = number%2;
    result << remainder << decToBin(number >> 1);
    return result;

我不确定QList究竟是如何工作的,但上述内容旨在将decToBin()的结果附加到结果中remainder之后。您可能需要稍微修改它才能使其正常工作。

结果将包含数字的二进制表示,以“反向”顺序(列表的第一个位置中的最低有效位)。

答案 1 :(得分:2)

在每个递归步骤中,您将创建一个新的QList结果;这是该步骤的本地,然后将其余部分插入其中。您不需要递归(通常在迭代时应该避免递归):

QList<bool> result;

while(number > 0) {
  result << number%2;
  number /=2;
}

// Edited to add: Just realized you would also have to reverse QList here.
//  Depends on it's interface.

return result;

或更好,只需使用标准容器:

bitset<sizeof(int)*CHAR_BIT> bs(number);

答案 2 :(得分:1)

首先为什么要让它递归?

正如其他人所指出的,result变量是本地变量,因此每次调用该方法时它都会“重置”。

因为计算机是二进制动物,所以我会改为:

QList<bool> widgetInput::decToBin(int number) 
{ 
    QList<bool> result = new QList<bool>(); 
    while (number)
    {
       result.Add(number & 1);
       number = number >> 1;
    }
    return result;
}

答案 3 :(得分:0)

QList<bool> result;是一个局部变量,因此在此方法调用中只能插入值。它只有一个。

解决方案很少:

  • 像方法参数一样添加QList,之后如果能正常工作
  • 或者将递归调用的返回值附加到列表

但是这些解决方案具有相反的顺序,因此您可以选择更适合您的解决方案。

顺便说一句,你在方法结束时缺少返回值。所以编译器应该发布警告。

答案 4 :(得分:0)

有一个更通用的迭代解决方案(不需要Qt):

NB1:您可以忽略“字节完成”部分以及“#include”。它只是用零来完成字符串,总是得到多个8位......

NB2:Utils是实现这些功能的类的名称......有人告诉我,标准库中已存在反向功能......尚未尝试过。

NB3:如果你没有反转字符串,小端将首先出现......所以正常情况是littleEndianFirst = false

public class CustomListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private List<RowItem> rowItemList;
    private final int VIEW_TYPE_CUSTOM = 0;
    private final int VIEW_TYPE_NORMAL = 1;
    NewPagerAdapter mCustomPagerAdapter;

    public CustomListAdapter(Context context, List<RowItem> rowItemList) {
        this.context = context;
        this.rowItemList = rowItemList;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0)
            return VIEW_TYPE_CUSTOM;
        else
            return VIEW_TYPE_NORMAL;
    }

    @Override
    public int getItemCount() {
        return rowItemList.size()+1;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case VIEW_TYPE_CUSTOM:
                recViewHolder1 viewHolderSecond = (recViewHolder1) holder;
                    mCustomPagerAdapter = new NewPagerAdapter(getSupportFragmentManager());
                    viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter);
                break;
            case VIEW_TYPE_NORMAL:
                recViewHolder2 viewHolderFirst = (recViewHolder2) holder;
                RowItem rowItem = rowItemList.get(position-1);
                viewHolderFirst.vName.setText(rowItem.getName());
                viewHolderFirst.vImage.setImageResource(rowItem.getImageId());
                break;

        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case VIEW_TYPE_CUSTOM:
                View itemView = LayoutInflater.
                        from(parent.getContext()).
                        inflate(R.layout.pagerlayout, parent, false);
                return new recViewHolder1(itemView);
            case VIEW_TYPE_NORMAL:
                View itemView1 = LayoutInflater.
                        from(parent.getContext()).
                        inflate(R.layout.rowlayout, parent, false);
                return new recViewHolder2(itemView1);
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }


    public static class recViewHolder1 extends RecyclerView.ViewHolder {
        protected static ViewPager vPager;


        public recViewHolder1(View v) {
            super(v);
            vPager = (ViewPager) v.findViewById(R.id.vPager);
        }
    }

    public class recViewHolder2 extends RecyclerView.ViewHolder implements View.OnClickListener {
        protected  TextView vName;
        protected  ImageView vImage;

        public recViewHolder2(View v) {
            super(v);
            v.setOnClickListener(this);
            vName = (TextView) v.findViewById(R.id.vName);
            vImage = (ImageView) v.findViewById(R.id.vImage);
        } } }