精华内容
下载资源
问答
  • 方法一:count计数法 #include<stdio.h>... //此方法是对一个数的二进制源码进行操作的 int count = 0; while (num) { if (num % 2 == 1) { count++; } num /= 2; } return count; }

    方法一:count计数法

    #include<stdio.h>
    
    int count_bit_one(unsigned int num)//负数的源码和补码不相同,所以把负数的二进制补码转化成对应的无符号的源码的数。正数的源码和补码相同。
    {
        //此方法是对一个数的二进制源码进行操作的
    	int count = 0;
    	while (num)
    	{
    		if (num % 2 == 1)
    		{
    			count++;
    		}
    		num /= 2;
    	}
    	return count;
    }
    
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	printf("%d\n", count_bit_one(num));
    	return 0;
    }
    

    方法二:按位与法(普通版)

    #include<stdio.h>
    
    int count_bit_one(int num)
    {
    	int i = 0;
    	int count = 0;
    	for (i = 0; i < 32; i++)
    	{
    		if (((num >> i) & 1) == 1)
    		{
    			count++;
    		}
    	}
    	return count;
    }
    
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	printf("%d\n", count_bit_one(num));
    	return 0;
    }
    

    方法三:按位与法(高效率版)

    #include<stdio.h>
    
    int count_bit_one(int num)
    {
    	int count = 0;
    	while (num)
    	{
    		count++;
    		num = num & (num - 1);//每进行一次这个操作,num的二进制表示中就少一个1,直到最后全为0
    	}
    	return count;
    }
    
    int main()
    {
    	int num = 0;
    	scanf("%d", &num);
    	printf("%d\n", count_bit_one(num));
    	return 0;
    }
    

    运行结果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 一个数的二进制时,与2取模后,从下往上取出0和1。这符合栈的特性,可以创建一个数组来储存0和1。 分析:先判断输入的是整数还是负数,负数在内存中是以补码形式储存,所以要另外进行处理。负数补码:最高位为...

    栈的特性是”先进后出”,先进去的会压在栈底,最后再被调用。求一个数的二进制时,与2取模后,从下往上取出0和1。这符合栈的特性,可以创建一个数组来储存0和1。
    分析:先判断输入的是整数还是负数,负数在内存中是以补码形式储存,所以要另外进行处理。负数补码:最高位为符号位,除了符号位外取反+1。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #define N 32//位数
    struct Mystruct{
        int top;//栈顶
        int a[N];
    };
    struct Mystruct mystack={-1,{0}};//初始化,-1代表是空
    int isEmpty()
    {
        if (mystack.top == -1)
        {
            return 0;//空返回0
        }
        else
        {
            return 1;
        }   
    }
    //把数据压入栈
    int push(num)
    {
        if (mystack.top == N - 1)//判断是否溢出
        {
            return 0;
        }
        else
        {
            mystack.top += 1;
            mystack.a[mystack.top] = num;
        }
        return 1;
    }
    //取出数据
    int pop()
    {
        mystack.top -= 1;
        return mystack.a[mystack.top + 1];
    }
    //对负数进行特别处理
    void fushu()
    {
        mystack.top = 31;
        mystack.a[mystack.top] = 1;//符号位
        for (int i = mystack.top-1; i >= 0; i--)//取反
        {
            if (mystack.a[i] == 1)
            {
                mystack.a[i] = 0;
            }
            else
            {
                mystack.a[i] = 1;
            }
        }
        mystack.a[0] += 1;//+1
        for (int j = 0; j < mystack.top - 1; j++)
        {
            if (mystack.a[j] == 2)//满2进1
            {
                mystack.a[j] = 0;
                mystack.a[j + 1] += 1;
            }
        }
        mystack.a[mystack.top] = 1;
    }
    void main()
    {   printf("请输入一个数:");
        int num;
        scanf("%d", &num);
        if (num>0)
        { 
            while (num)//传入数据
            {
                push(num % 2);
                num /= 2;
            }
            while (isEmpty())//非空返回1
            {
                printf("%d", pop());
            }
        }
        else if (num == 0)
        {
            printf("%d", num);
        }
        else//小于0
        {
            num *= -1;
            while (num)
            {
                push(num % 2);
                num /= 2;
            }
            fushu();
            while (isEmpty())//非空返回1
            {
                printf("%d", pop());
            }
        }
        system("pause");
    }

    正数的输出
    这里写图片描述
    负数输出为反码
    这里写图片描述

    展开全文
  • 12.机器数与真值 1)机器数  一个数在计算机中的二进制表示形式,叫做这个...机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.  比如,十进制中的数 +3,计算机字长为8位,转换成二进制

    12.机器数与真值

    1)机器数

        一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1.

        比如,十进制中的数 +3,计算机字长为8位,转换成二进制就是00000011。如果是-3,就是10000011。

        那么,这里的00000011和10000011就是机器数。

    2) 真值

        因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的只有符号数的10000011,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号的的机器数对应的真正树枝称为机器数的真值。

        例如:0000 0001的真值 = +000 0001 = +1, 1000 0001的真值 = -000 0001 = -1


    13.原码、反码、补码

        数据在计算机中的存储方法:

        数据在计算机内部是以补码的形式储存的。


        引入原码、反码、补码的意义:

        为了计算机电路的设计更加简单,计算机只能执行加法,如果执行减法,就等于加上一个负数。这时,反码和补码就有了存在的意义。


    1)原码:

        一个数绝对值的二进制表示,如果是+: 最高位(最左侧的位) 改0

                                                           -: 最高位(最左侧的位) 改1

    2)反码:

        正: 整数的反码等于原码

        负: 除符号位不变,其他位逐位取反(1->0,0->1)

    3)补码:

        正:正数的补码等于原码

        负:1.反码+1;

               2.在原码基础上符号位不变,其他位取反,最后再+1;

        补码——>原码: 符号位不变,取反+1


    14.位运算

        ①用于整数的二进制位之间的运算

            & 按位与 :如果两个位进行&操作,同1则结果为1,有0结果为0  实用:任何数和1进行&运算,可以获取一个数的最低位

            | 按位或  :  有1则为1,同0则为0

            ~ 按位取反   : 1变0,0变1

            ^ 按位异或   : 相同为0,不同为1

            >> 右移位   : 各二进全部右移n位,低位丢弃,高位补0

            << 左移位   : 各二进全部左移n位,高位丢弃,低位补0  注意:左移可能改变一个数的正负性

            左移、右移可用于快速计算一个数乘以或除以2的n次方。    

    ​    ②位运算技巧:

            可以用来“取二进制”,“判断奇偶数”,“交换两个变量的值”

            1)取二进制:分别右移再与1进行&运算;

            2)判断奇偶:与1进行&运算,结果为1是奇数,结果为0是偶数;

            3)交换变量的值:

                    方法一:多定义一个变量;

                    方法二:a = a+b;   b = a-b;  a = a-b;

                    方法三:a = a^b;   b = a^b;  a = a^b;


    15.变量地址获取及输出原理

        %p输出地址

        定义两个变量,都是int类型:

        int a,int b;

        a的地址大,b的地址小,但是不一定连续。计算机分配内存的时候:从高地址向低地址分配。

        先定义的,分配高地址,后定义的,分配低地址。

    ①内存:内存由若干个1个字节(内存单元)构成的,每个字节(内存单元)有唯一的一个地址。

    ②变量的储存:低字节存在低地址,高字节存在高地址。


    16.改变整形变量所占的存储空间

    ①改变一个数的符号 表示:原来最高位用作标识的一个数的正负,现在用来参与计算;系统默认的是一个有符号的数

    ②无符号的数:定义 unsigned int x;   有符号的数:定义 signed int y;

    ③char型常量的存储问题(Xcode编译器):

        1)sizeof('a')   =   4;        ——>先找到'a'的ascll码的值 97 ——>把97按照int类型进行排列00000000 00000000 00000000 01100001  ——>把四个字节存储在内存中

        2)char ch = 'a' ; sizeof(ch) = 1;        —— >先找到'a'的ascll码的值 97 ——>把97转换为2进制01100001 ——> 把这一个字节存储在内存中

        总结,char类型的常量和变量的存储方式是不一样的

        ascll码 0-127 用来存储常用的字符



    展开全文
  • //写一个函数求a二进制(补码)表示中有几个1 //方法一(道理同十进制%10,/10) #include<stdio.h> int count_bit_one(unsigned int i){//无符号整型可以在输入负数情况下也可以正确输出 int count=0;...
    //写一个函数求a的二进制(补码)表示中有几个1
    //方法一(道理同十进制%10,/10)
    #include<stdio.h>
    int count_bit_one(unsigned int i){//无符号整型数可以在输入负数的情况下也可以正确输出
    	int count=0;//计数器
    	while(i){//当i不等于0时
    		if(i%2==1){//%2余1时表示这个位置有“1”的存在,计数器加一位进行计数
    			count++;
    		}
    		i=i/2;//%2后/2改变原数字的大小,进行下一次运算
    	}
    return count;//返回整型的计数器记下的数字
    }
    int main(){
    	int i=0;
    	scanf("%d",&i);//输入一个数字
    	int count=count_bit_one(i);//定义一个函数,函数返回值类型是int型
        printf("1的个数:%d\n",count);//打印返回值
    return 0;
    }
    
    //方法二
    int count_bit_one(int i){
    	int count=0;//创建计数器
    	int n=0;
        for(n=0;n<32;n++)
    	{//for循环是因为每次移动的位数应该逐渐增加,直到将整个位数都比较完
    		if(((i>>n)&1)==1){//i向右移动n位,与1进行“与”运算,得到1是证明原数字i在该位置有1,计数器加1计数
    			count++;
    		}
    	}
    return count;//返回整型的计数器记下的数字
    }
    #include<stdio.h>
    int main(){
    	int i=0;
    	scanf("%d",&i);
    	int count=count_bit_one(i);
    	printf("1的个数:%d\n",count);
    return 0;
    }
    
    //方法三
    int count_bit_one(int i){
    	int count=0;//创建计数器
    	while(i){
    		i=i&(i-1);i和i-1进行异或运算,当i=0时,while循环停止,经过逻辑验证,停止时计数器记下的数字就是该二进制数字当中“1”的个数
    		count++;
    	}
    return count;
    }
    #include<stdio.h>
    int main(){
    	int i=0;
    	scanf("%d",&i);
    	int count=count_bit_one(i);
    	printf("1的个数:%d\n",count);
    return 0;
    }
    
    //前两种方法相似,都要将整个32个比特位都比较完,比较浪费时间和空间,相对来说,第三种算法的实现相对简单,运算过程也比较简单,是三个方法中最好的方法
    
    展开全文
  • 首先了解什么是补码,即负数在计算机中二进制表示(原码、反码与补码) ... 1 符号位   C语言规定,把内存最高位作为符号位,且用0表示正数,用1...  一个整数,按照绝对值大小转换成二进制,称为原码。...
  •  输入一个整数,输出二进制表示中1个数。其中负数用补码表示。 题目引自http://ac.jobdu.com/problem.php?cid=1046&pid=0。 算法分析:  第一眼看见题目时候,最初想法是对输入整数对2取余,如果...
  • C语言机器数的表示

    2020-04-21 15:08:46
    经过数据处理之后,输出个数的原码,反码,补码,和移码的表示方法。其中整数部分和小数部分分别用32位机器数表示。 #include "stdio.h" #include <stdlib.h> #include <string.h> #define TTWO 32 #...
  • **比如:15 二进制数位0000 0000 0000 0000 0000 ...(说明:采用unsigned是int类型-1中1的个数位32,-1是负数,在计算机中存补码) (1)方法 <类比于十进制> 例如:输出123 数字 ...
  • 今天学弟问了我两个很好问题: 1、各种基本数据类型本质区别是什么?... 我理解是 char是一个字节,用char数据类型保存-1应该是11111111(补码),然后用%u输出应该是2八次方减一,但是为啥结...
  • 理解是:string类型是char *,占内存是四字节,值是16进制,我调试string是0x004157b8,十进制是4282296,那么是直接把0x004157b8去截取低位b8,还是把string先转十进制4282296,变成整型常量,再用int...
  • C语言培训第

    2016-09-09 19:41:00
    一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?(似乎问题和上面话没关系啊,嘘!往下看!) 首先来说编译器并不会报错,但是具体内存操作就要和我们刚才说有关系了,...
  • 从零开始的c语言学习

    2021-02-12 20:49:47
    从零开始的c语言学习 前言 昨天有点事断更天今天补上,想了想标题...计算机存储的数补码,u_int a——无符号整数。 引用全局变量应该强调一下,extern. static修饰局部变量时候,局部变量生命周期变长。修饰全局
  • 储存方式不一样 将一个类型输出到另一个类型中结果就不一样 整型在内存中存储 例如int i=3; 储存 1.先看赋值操作符右边,将对应数字转换成二进制序列 ,在转换成补码形式 2.看变量类型开辟了多少空间,然后将二...
  • //左移运算符是用来将一个数的各二进制位全部左移若干位。相当于乘法运算,表示为"&lt;&lt;" //右移运算符是用来将一个数的各二进制位全部右移若干位。相当于除法运算,表示为"&gt;&...
  • c语言char类型相关知识点

    千次阅读 2017-09-18 10:18:07
    过去在使用char类型时,...1.char类型本质其实就是开辟了一个字节空间存储数字,当使用%d时输出数字,使用%c时输出ASCII对应字符。 2.char默认为signed char类型,最大位为符号位,范围是-128到127.用补码的方式
  • C语言学习

    2016-07-27 19:47:52
    今天学习了小数点后数字二进制转换,例如:将0.625转换为二进制...还有就是数据类型和内存讲了sizeof运算符并不是一个函数,函数是有输出有输入,老师也说了sizeof是一个API,还知道了补码,原码,反码应用,
  • 191. 位1个数 c语言

    2021-03-22 10:06:53
    编写一个函数,输入是一个无符号整数(以二进制串形式),返回其二进制表达式中数字位数为 ‘1’ 个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入...
  • 开始我以为这不是大问题,因为本来整型在内存中就是以补码的形式存在输出自然也是按照补码输出的,例如C语言中 printf("%X\n",-3); //输出 //FFFFFFFD 但是我看了下Pythonbin()的输出之后震惊了...
  • c语言经典案例

    2014-10-30 08:06:57
    实例220 求一个数的补码 332 实例221 普通的位运算 333 实例222 整数与0异或 334 第14章 存储管理 335 实例223 使用malloc()函数分配内存 336 实例224 调用calloc()函数动态分 配内存 337 实例225 为具有3个数组元素...
  • //如果变量是一个十进制表示负整型,则一定要注意,补码的换算。 常量和变量(或参考该文) 整型与字符型关系 指针和数组 字符串操作函数 文件操作 结构体 共用体 三种程序结构 函数指针 ...
  • 题目描述:输入一个整数,输出二进制表示中1个数。其中负数用补码表示。 输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,代表测试样例数量。对于每个测试样例输入为一个...
  • 题目描述:输入一个整数,输出二进制表示中1个数。其中负数用补码表示。 本文采用两种方式实现,我称他们为normal方法和surprise方法,他们区别如下: normal使用是循环移位,因为考虑到有符号负数右移...
  • 输入一个整数,输出二进制表示中1个数。其中负数用补码表示。 输入: 输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,代表测试样例数量。对于每个测试样例输入为一个整数。。n保证...
  • C语言讲义.doc

    2018-01-27 10:41:43
    9.5 多源代码文件程序编译 47 9.5.1 头文件使用 47 9.5.2 #include与#define意义 47 9.5.3 #ifndef与#endif 47 9.6 函数递归 48 9.6.1 递归过程分析 48 9.6.2 递归优点 52 9.6.3 递归缺点 52 1 指针...
  • 有趣c语言例题之明码

    2018-11-05 12:47:27
    解题思路: 本题主要用到十进制与二进制转换 输出时主要是每行输出两个...)/一个整数按照绝对值大小转换成二进制,是为原码。原码就上面:00000101。/3得到了反码,嗯,反码是和原码反着来。然后,加一...
  • C语言长盛不衰霸榜长久的一部分原因,在于它对于计算机底层操作。位运算,作为实现底层操作的一部分功能值得我们关注。 当然从功利角度而言,位运算在以后面试、笔试过程中对我们有着极大便利。 前言: 首先...
  • C语言基础知识(二)

    2020-07-28 20:52:52
    对无符号整型数据输出用“%u”,表示用无符号十进制数的格式输出。 例子: printf("%u\n", u_num); 三、浮点数存放方式 float 和 double 类型,视系统定,多少位用于小数部分,多少位用于指数部分。 float型...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

c语言输出一个数的补码

c语言 订阅