如何避免无符号短整型二进制表示输出时出现前导零?
解决无符号短整型转二进制的前导零问题
嘿,咱们来搞定你这个无符号短整型转二进制时的前导零问题!你的原代码会从最高位开始输出全部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
相关产品推荐
相关产品推荐

