zoukankan      html  css  js  c++  java
  • 剑指offer-int类型负数补码中1的个数-位操作

    在java中Interger类型表示的最大数是

    System.out.println(Integer.MAX_VALUE);//打印最大整数:2147483647

    这个最大整数的二进制表示,头部少了一位,说明java中最高位用1表示,

    这个永远占据最高位

    1111111 11111111 11111111 11111111   


    System.out.println(Integer.MIN_VALUE);//打印最小整数:-2147483648

    自己写出其二进制表示的原码

    0111 1111  11111111 11111111 11111111

                          原码                反码                补码
            - 127    1111 1111  -〉 0111 1110  -〉 0111 1111
              127    0111 1111  -〉 1000 0000  -〉 1000 0001
             128(无)
             -128    1000 0000  -〉 0111 1111  -〉  1000 0000
       原码中负的0表示最小的那个数字(只有这个地方特别)
    0111 1111补码加1变1000 0000(从-127到-128) 再加一变成1000 0001
    单字节-127,原码是1111 1111,反码1000 0000,补码是1000 0001,计算机中单字节-127表示为1000 0001
    单字节-128,原码貌似表示不出来,除了符号为,最大的数只能是127了,其在计算机中的表示为1000 0000。
     
    2、大小的习惯(个人观点)
    也可以从数据大小上来理解。还是以单字节数据为例。有符号数中,正数的范围是[1,127],最大的是127,不考虑符号为,其表示为111 1111;最小的是1,不考虑符号为,其表示为000 0001。
    负数中,最大的是-1,我们就用111 1111表示其数值部分。后面的数据依次减1。减到000 0001的时候,我们用它标示了-127。再减去1,就变成000 0000了。还好我们有符号为,所以有两个0。把其中带符号的0拿过来,表示-128,刚好可以满足表示范围。
     
     public int NumberOf1(int n){

    if(n<0) n=(-n)+1;
    int count =0;
    //反复调用开始传入被除数n>=0
    while(n!=0){//只要被除数不为0就循环
    if(n%2==1) count++;
    n = n/2;
    }
    return count;
    }

    //赋百度文库的链接

    https://wenku.baidu.com/view/b3474ccfd5d8d15abe23482fb4daa58da0111cc5

  • 相关阅读:
    CentOS6 配置阿里云 NTP 服务
    使用docker-compose运行nginx容器挂载时遇到的文件/目录问题
    Springboot配置文件参数使用docker-compose实现动态配置
    Dockerfile文件全面详解
    docker 生成mysql镜像启动时自动执行sql
    CentOS无法识别NTFS格式U盘完美解决方案
    网络模型与网络策略
    k8s更换网络插件:从flannel更换成calico
    数据采集实战(四)-- 线性代数习题答案下载
    leedcode 146. LRU 缓存机制(哈希+双向链表)
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/7265747.html
Copyright © 2011-2022 走看看