You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免无符号短整型二进制表示输出时出现前导零?

解决无符号短整型转二进制的前导零问题

嘿,咱们来搞定你这个无符号短整型转二进制时的前导零问题!你的原代码会从最高位开始输出全部16位,自然就带了一堆前导零。咱们用基础的位运算和标准操作符就能解决,完全不用花里胡哨的函数。

方法一:先定位最高位的1,再从该位开始输出

这个思路是先找到数字k中最左边(最高位)的那个1的位置,然后从这个位置开始依次输出每一位,直接跳过前面的所有零。

修改后的完整代码如下:

#include <iostream>
using namespace std;

int main() {
    unsigned short int k;
    while (true) {
        cin >> k;
        if (!k) {
            // 可选:如果需要输入0时输出0,取消下面这行注释
            // cout << "0" << endl;
            break;
        }
        // 找到最高位的1的位置(unsigned short是16位,从0到15计数)
        int highest_bit = 15;
        while (highest_bit >= 0 && !(k & (1 << highest_bit))) {
            highest_bit--;
        }
        // 从最高位的1开始,逐位输出
        for (int i = highest_bit; i >= 0; i--) {
            cout << ((k >> i) & 1);
        }
        cout << endl;
    }
    return 0;
}

代码细节解释:

  • 1 << highest_bit:生成一个只有第highest_bit位为1的掩码(比如当highest_bit=15时,就是0x8000)。
  • k & (1 << highest_bit):判断k的第highest_bit位是否为1,结果为0就说明该位是0,继续往下找。
  • 找到最高位后,循环从该位到第0位,每次把k右移i位,再和1做按位与,就能取出当前位的值并输出。

方法二:用标志位跳过前导零

另一种更直观的思路是设置一个标志位,标记是否已经开始输出有效位(也就是遇到第一个1之后)。在遇到第一个1之前,所有前导零都跳过;一旦遇到第一个1,就输出所有后续的位(包括0)。

代码如下:

#include <iostream>
using namespace std;

int main() {
    unsigned short int k;
    while (true) {
        cin >> k;
        if (!k) {
            // 可选:输入0时输出0,取消下面注释
            // cout << "0" << endl;
            break;
        }
        bool started = false; // 标记是否已开始输出有效位
        for (int i = 15; i >= 0; i--) {
            int bit = (k >> i) & 1;
            if (bit == 1) {
                started = true;
                cout << bit;
            } else if (started) {
                // 已经开始输出后,遇到0也要输出
                cout << bit;
            }
            // 未开始且是0的情况,直接跳过不输出
        }
        cout << endl;
    }
    return 0;
}

代码细节解释:

  • started初始为false,此时遇到的所有0都直接跳过,不输出。
  • 当遇到第一个1时,把started设为true,同时输出这个1。
  • 之后不管遇到0还是1,只要started是true就输出对应的位,保证从第一个1开始输出,没有前导零。

额外提示

如果需要处理输入0的场景(原代码输入0就直接退出),可以在if (!k)的分支里加上cout << "0" << endl;,这样输入0时会输出0再退出,逻辑更完整。

内容的提问来源于stack exchange,提问作者eLimiT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:26:43