赞
踩
#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)的返回值为32(无论是在32位机器还是64位机器都是一样的)
x=x&(x-1)
这个表达式执行一次就会将x的2进制中最右边的1去掉
在x变成0之前,表达式能执行几次,就去掉几个1
所以这个代码实现了 求一个有符号整数二进制补码中1的个数
我们知道-1的补码是全1,而int类型4个字节32位
#include<stdio.h>
int main() {
int count = 0;
int x = -1;
while (x)
{
count++;
x = x >> 1;
}
printf("%d", count);
return 0;
}
有符号数右移运算高位是补符号位的负数的符号位是1,所以x永远不会变为0,是个死循环
赋值语句
a = (b = (c = 2 , d = 3)) true
i++ true
a/b = 2 a/b是表达式 表达式计算的结果是一个值不能做左值
#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; }
a = a < a + 1; true
若有 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;
}
#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;
}
#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;
}
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; }
找到所有数组中消失的数字
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。