求32位整数的二进制个数_原码反码补码真的烦

题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

我10秒钟做出了正数的1的个数,却秀死在负数。。。

public class Solution {
    public int NumberOf1(int n) {
		//正数好做,爽死了
        if(n>=0){
            int c=0;
            while(n>0){
                if(n%2==1){
                    c++;
                }
                n=n/2;
            }
            return c;
        }else{//负数就不好玩了
            //先处理-0
            //+0是0,而-0定义为-2^32
            if(n==(-2147483648))
                return 1;
            //开始操作起来,字符串不是玩的很溜吗
            StringBuilder sb = new StringBuilder();
            n=-n;//负数取反的正数
            while(n>0){
                sb.append(n%2);
                n=n/2;
            }
            String str = sb.toString();//计算得该正数的逆序原码,若高位补上1就是负数的原码了
            sb = new StringBuilder();
            //sb用来存储调好顺序的源码,记得此处前面符号位1没加,和0没加
            for(int i=str.length()-1;i>=0;i--){
                sb.append(str.charAt(i));
            }
            //来补位了
            StringBuilder sb2 = new StringBuilder();
            //先把符号位1加上
            sb2.append(1);
            //剩余的位数0补充,凑齐32位
            int size = sb.toString().length();
            for(int i=0;i<31-size;i++){
                sb2.append(0);
            }
            sb2.append(sb);//真正的负数源码
            //下面开始取反了,注意符号位第一位不变
            for(int i=1;i<sb2.length();i++){
                if(sb2.charAt(i)=='0'){
                    sb2.setCharAt(i,'1');
                }else{
                    sb2.setCharAt(i,'0');
                }
            }
            //sb2是取反之后的反码
            //进行+1
            boolean flag = true;
            for(int i=sb2.length()-1;i>0;i--){
                if(flag){
                    if(sb2.charAt(i)=='0'){
                        sb2.setCharAt(i,'1');
                        flag=false;
                    }else{
                        sb2.setCharAt(i,'0');
                        flag=true;
                    }
                }
                
            }
            //来统计1的个数吧
            int c=0;
            for(int i=sb2.length()-1;i>=0;i--){
                if(sb2.charAt(i)=='1'){
                    c++;
                }
            }
            return c;
        }
    }
}

在这里插入图片描述

  • 反思
    感觉这样求,好蠢啊。。。。负数的补码这么恶心吗,去看看大佬怎么做。
在C语言中,我们可以使用`stdio.h`库的函数以及运算符来实现这个功能。首先,我们将解释如何将十进制整数转换为二进制原码反码补码和移码表示。 1. **将十进制转为二进制**: 使用`printf`格式化输出,结合模操作 `%d %o`,可以得到二进制表示。 ```c #include <stdio.h> int main() { int decimal; printf("Enter a decimal number: "); scanf("%d", &decimal); printf("Binary representation: %o\n", decimal); // ... (后续步骤) return 0; } ``` 2. **原码反码补码计算**: - **原码**: 十进制直接转换,最高为符号。 - **反码**: 对原码反后再加1(非负数不变,负数变为其绝对值的反码)。 - **补码**: 同反码,但无需加1,因为正数和0的补码即为其本身。 ```c // 原码 unsigned char binary = decimal; // 反码 binary ^= 1; // 如果是负数,先反 // 补码 (对于有符号数,不需要额外处理) ``` 3. **移码(只有用于带符号整数)**: 移码是对原码加上1,使得最大正数的移码对应于1的最高置(例如,在8系统中是10000000)。 4. **IEEE754浮点数**: 对于浮点数,你需要了解其结构,包括阶码(指数部分)和尾数(小数部分)。C标准库不直接提供转换为IEEE754浮点数的功能,通常需要自定义算法或者利用第三方库(如`gmp.h`)。 下面是一些相关的操作: ```c // IEEE754 32浮点数示例 typedef struct { uint32_t significand : 23; // 尾数部分 uint32_t exponent : 8; // 阶码部分(偏移量为127) uint32_t sign : 1; // 符号 } float32; void convert_to_ieee(float32 *float_num, int decimal) { // 这里仅作演示,实际实现复杂,参考相关资料 // ... } // 示例使用 float32 ieee_float; convert_to_ieee(&ieee_float, decimal); printf("IEEE 754 float: %f\n", ieee_float.significand * pow(2, ieee_float.exponent - 127)); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值