当前位置:   article > 正文

【C语言day10】_int func(x){ int countx = 0 ;while(x) ( countx 十十;

int func(x){ int countx = 0 ;while(x) ( countx 十十;= x&(x-1) ;} return coun
#include<stdio.h>

int func(int x)
{
	int count = 0;

	while (x)
	{
		count++;
		x = x & (x - 1);//与运算
		//
		
	} 
	return count;
}

int main() {
	int count = func(-1);
	printf("%d\n", count);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

传入(-1)的返回值为32(无论是在32位机器还是64位机器都是一样的)

x=x&(x-1)
这个表达式执行一次就会将x的2进制中最右边的1去掉
在x变成0之前,表达式能执行几次,就去掉几个1
所以这个代码实现了 求一个有符号整数二进制补码中1的个数 
我们知道-1的补码是全1,而int类型4个字节32位
  • 1
  • 2
  • 3
  • 4
  • 5

#include<stdio.h>

int main() {
	int count = 0;
	int x = -1;

	while (x)
	{
		count++;
		x = x >> 1;
	}
	
	printf("%d", count);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

有符号数右移运算高位是补符号位的负数的符号位是1,所以x永远不会变为0,是个死循环


赋值语句

a = (b = (c = 2 , d = 3)) true
i++ true
a/b = 2  a/b是表达式 表达式计算的结果是一个值不能做左值
  • 1
  • 2
  • 3
#include<stdio.h>

int main() {
	
	int b = 0;
	int c = 0;
	int d = 0;
	int a = 0;

	a = (b = (c = 2, d = 3));
	//printf("%d\n", d = 3);//3
	printf("%d\n", a);//3
	printf("%d\n", b);//3
	printf("%d\n", c);//2
	printf("%d\n", d);//3

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
a = a < a + 1; true
  • 1

若有 int w=1, x=2, y=3, z=4; 则条件表达 w < x ? w : y < z ? y : z 的值是

#include<stdio.h>

int main() {
	int w = 1, x = 2, y = 3, z = 4;

	printf("%d\n", w < x ? w : y < z ? y : z);
	//w<x?w:(y<z?y:z)
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

#include<stdio.h>

int main()
{
	int a = 1, b = 2, m = 0, n = 0, k;

	k = (n = b < a) && (m = a);
	
	printf("%d,%d\n", k, m);
	//0 0 	
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
#include<stdio.h>

int main()
{
	int a = 1, b = 2, m = 0, n = 0, k;

	k = (m = a) && (n = b < a);
	
	printf("%d,%d\n", k, m);
	//0 1
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

k=(n=b<a)&&(m=a);

这部分的执行顺序如下:先执行n=b<a部分,其中,关系运算符优先级高于赋值运算符,所以先算b<a,得到0,n=0赋值运算的结果将作为括号内表达式的结果,即(n=b<a)&&(m=a)转换成(0)&&(m=a),&&运算前表达式为假,则后面的括号(m=a)不运算,m值还是0,最后,&&的结果是0,即k=0


不用加减乘除做加法

题目来源
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
两次异或再求和

#include<stdio.h>

int Add(int num1, int num2) {
    // write code here
    num1 = num1 ^ num2;
    num2 = num1 ^ num2;
    num1 = num1 ^ num2;
    return num1+num2;
}

int main() {
    int a = 1;
    int b = 2;
    int c = Add(a, b);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

找到所有数组中消失的数字

题目来源

int* findDisappearedNumbers(int* nums, int numsSize,int* returnSize) {
    *returnSize = 0;
    int* sums = (int*)malloc(numsSize * (sizeof(int)));
    int* arrs = (int*)calloc(numsSize+1, sizeof(int));

    //[1,1]
    //2
    int i = 0;
    for (i = 0; i < numsSize; i++) {
        arrs[nums[i]] = 1;
    }

    for (i = 1; i <= numsSize; i++) {
        if (arrs[i] == 0) {
            sums[(*returnSize)++] = i;
        }
    }
    return sums;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/535188
推荐阅读
相关标签
  

闽ICP备14008679号