代码例题(1-3)(含进阶版)及讲解:1.求两个数二进制中不同位的个数 2.打印整数的二进制的奇数和偶数位 3.交换两个变量,不创建临时变量

代码例题(1-3)(含进阶版)及讲解:1.求两个数二进制中不同位的个数 2.打印整数的二进制的奇数和偶数位 3.交换两个变量,不创建临时变量 ,第1张

#define _CRT_SECURE_NO_WARNINGS 1 
//求两个数二进制中不同位的个数
//要求:实现两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
//例子:输入:1999 2299            输出:7
// 
//普通·版
//#include
//int main()
//{
//    int m = 22;//初始值即为输入值,可更改
//    int n = 33;
//    int i = 0;
//    int count = 0;
//    for (i = 0; i < 32; i++)
//    {
//        if (((n >> i) & 1 )!= ((m >> i) & 1))
//        {
//            count++;
//        }
//    }
//    printf("%d\n", count);//打印结果为5
//    return 0;
//}
//进阶版
//m^n(异或),相同为0.相异为1
//#include
//int retu(int n)
//{
//    int count = 0;
//    int i = 0;
//    while (n)
//    {
//        n = n & (n - 1);
//            count++;
//    }
//    return count++;
//}
//int main()
//{
//    int m = 22;
//    int n = 33;
//    int count = 0;
//    int i = 0;
//    scanf("%d %d", &m, &n);
//    int ret = m ^ n;//相同为0,相异为1
//    count=retu(ret);
//    printf("%d\n", count);
//    return 0;
//}


//打印整数的二进制的奇数和偶数位(获取一个整数二进制序列中所有的偶数位和奇数位,分别打印二进制序列)
//#include
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);//scanf("%d",&n),,,,,不能加\n
//    int i = 0;
//    //打印所有偶数位
//    for (i = 31; i >= 1; i -= 2)//for循环,使每个符合条件的位(偶数位)打印
//    {
//            printf("%d ", (n >> i) & 1 );//(n>>i)表示把最高位移动到最低位,然后与1按位与,打印结果
//    }
//    printf("\n");
//    //打印所有奇数位
//    for (i = 30; i >= 0; i -= 2)
//    {
//        printf("%d ", (n >> i) & 1);//(n>>i)表示把最高位移动到最低位,然后与1按位与,打印结果
//    }
//    return 0;
//}

//交换两个变量,不创建临时变量
//思路:a^b^b=a; (放在a里,就交换a,b)       a^b^a=b;(放在a里,就交换a,b)
//#include
//int main()
//{
//    int a = 0;
//    int b = 0;
//    scanf("%d %d", &a, &b);
//    a = a ^ b;//a放置的是a^b
//    b = a ^ b;//b=a^b=a^b^b=a,,,,b变成原来的a
//    a = a ^ b;//a=a^b^a=b,,,,a变为原来的b
//    printf("%d %d ", a, b);
//    return 0;
//}

//表达式求值先看是否存在整形提升或算术运算,再进行计算
//表达式真正计算时,先看相邻 *** 作符的优先级决定先算谁
//相邻 *** 作符的优先级相同的情况下,看 *** 作符的结合性决定计算顺序
//即使有优先级和结合性,表达式的值依然可能不唯一//如int ret=(++i)+(++i)+(++i);计算顺序可能是++i ++i ++i 4+4 8+4 也可能是++i ++i 3+3 ++i 6+4
// 
//指针是变量,用来存放地址,指针变量中存的有效地址可以唯一指向内存中的一块区域
// 局部变量不初始化就是野指针,野指针不能被正常使用


//以下系统中,int类型占几个字节,指针占几个字节, *** 作系统可以使用的最大内存空间是多大
//32位下:4        4            2^32(每个字节有0,1....共32个字节)                       64位下:4         8           2^64

//例题,求下面代码的值

#include
int main()
{
    int arr[] = { 1,2,3,4,5 };//short型访问两个字节
    short* p = (short*)arr;//把数组给了short型的指针,并把short型指针交给p
    int i = 0;
    for (i = 0; i < 4; i++)
    {
        *(p + i) = 0;//p是short型指针,p+0不跳过字节,是从01 00的0开始,p+1跳过2个字节
    }
    //10进制:1                二进制:00000000000000000000000000000001    十六进制00 00 00 01
//把十六进制1-5各个数存在内存中(vs内是倒着存)小端存储为
//01 00 00 00(四个字节)02 00 00 0(四个字节)03 00 00 00(四个字节)04 00 00 00(四个字节) 05 00 00 00(四个字节)
//第一次for循环,p+0不跳过字节,是从01 00的0开始,更改对象01 00,变为00 00(此时i++=1)
//第二次for循环,p+1跳过二字节,是从00 00的0开始,更改对象00 00,变为00 00(此时i++=2)
//第三次for循环,p+2跳过四字节,是从02 00的0开始,更改对象02 00,变为00 00(此时i++=3)
//第四次for循环,p+3跳过六字节,是从00 00的0开始,更改对象00 00,变为00 00(此时i++=4,跳出循环)
//一次改两个字节,改了4次,八个字节,两个整形,把1和2的空间全部改为0
    for (i = 0; i < 5; i++)
    {
        printf("%d ", arr[i]);//以数组类型访问并打印,(4个字节)
    }//打印结果为0 0 3 4 5
//第二次for循环只是为了打印修改后的值
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607509.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存