魔域奇客在哪菜鸟教程

利用异或 ^ 来交换两个数的值,魔域奇客在哪而且不引入其他变量。

unsigned int a=60; //0011 1100 unsigned int b=13; //0000 1101 a=a^b; //a=a^b=0011 0001 b=a^b; //b=a^b=0011 1100 相当于b1=(a^b)^b a=a^b; //a=a^b=0000 1101 相当于a1=(a^b)^((a^b)^b)

实例

#include<stdio.h> int main( ) { unsigned int a=60; //0011 1100 unsigned int b=13; //0000 1101 printf("a=%d,b=%d",a,b); //输出a,b的值 printf("\n"); a=a^b; //a=a^b=0011 0001 b=a^b; //b=a^b=0011 1100 a=a^b; //a=a^b=0000 1101 printf("a=%d,b=%d",a,b); //输出a,b的值 }

结果:

a=60,b=13; a=13,b=60;

仅用一行代码实现的方法:

a^=b^=a^=b;

其等价于:

a=a^b; b=a^b; a=a^b;

当然,这种利用位运算的交换方法只适用于整型变量,不能用于浮点型变量!

sfvx

268***0313@qq.com

8年前 (2017-09-13)

#0

BeanShell

286***384@qq.com

226

利用位与 & 运算,判断一个整数是否是2的整数次幂。

二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果,例如:

2 --> 0000 0010 1 --> 0000 0001 2&1 --> 0000 0010 & 0000 0001 = 0 4 --> 0000 0100 3 --> 0000 0011 4&3 --> 0000 0100 & 0000 0011 = 0 8 --> 0000 1000 7 --> 0000 0111 8&7 --> 0000 1000 & 0000 0111 = 0

可以看出所有的 1 完美的错过了,根据位与的特点可知 m&(m-1) 的结果为 0。

如果整数 m 不是 2 的 n 次幂,结果会怎样呢?例如 m=9 时:

9 --> 0000 1001 8 --> 0000 1000 9&8 --> 0000 1001 & 0000 1000 != 0

利用这一特点,即可判断一个整数是否是2的整数次幂。

示例:

int func(int num) { return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0 }

返回值为 1,则输入的正整数为 2 的整数次幂,返回值为 0 则不是。

BeanShell

286***384@qq.com

8年前 (2017-11-04)

#0

布克F91

335***443@qq.com

118

对取余运算的说明

取余,也就是求余数,使用的运算符是 %。C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。

另外,余数可以是正数也可以是负数,由 % 左边的整数决定:

如果 % 左边是正数,那么余数也是正数;

如果 % 左边是负数,那么余数也是负数;

请看下面的例子:

#include <stdio.h> int main() { printf( "100%%12=%d \n100%%-12=%d \n-100%%12=%d \n-100%%-12=%d \n", 100%12, 100%-12, -100%12, -100%-12 ); return 0; }

运行结果:

100%12=4 100%-12=4 -100%12=-4 -100%-12=-4

布克F91

布克F91

335***443@qq.com

7年前 (2018-06-13)

#0

forspy

qiu***@126.com

49

对于 2 的幂指数的详细程序

#include <stdio.h> int num; int func(int num) { if ((num>0)&&(num&(num-1))==0) { printf("%d是2的整数次幂",num); } else { printf("%d不是2的整数次幂",num); } return((num>0)&&(num&(num-1))==0); } int main() { printf("请输入要查询的数\n"); scanf("%d",&num); func(num); }

forspy

qiu***@126.com

7年前 (2018-07-06)

#0

RES

432***967@qq.com

36

不同长度的数据进行位运算

如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

以“与”运算为例说明如下:我们知道在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足:

(1)如果整型数据为正数,左边补 16 个 0。

(2)如果整型数据为负数,左边补 16 个 1。

(3)如果整形数据为无符号数,左边也补 16 个 0。

如:long a=123;int b=1; 计算 a & b

如:long a=123;int b=-1; 计算 a & b

如:long a=123; unsigned int b=1; 计算 a & b

RES

432***967@qq.com

7年前 (2018-07-16)

#0

荒城梦呓

449***19@qq.com

66

| 和 ||,& 和 && 的区别

我们将 ||&& 定义为逻辑运算符,而 |& 定义为位运算符。

&& 如果两个操作数都非零,则条件为真;

|| 如果两个操作数中有任意一个非零,则条件为真。

& 按位与操作,按二进制位进行""运算。运算规则:(有 0 则为 0)

0&0=0; 0&1=0; 1&0=0; 1&1=1;

| 按位或运算符,按二进制位进行""运算。运算规则:(有 1 则为 1)

0|0=0; 0|1=1; 1|0=1; 1|1=1;

那么,问题来了,在判断语句中,用 | 还是 ||,& 还是 &&?

判断语句中为布尔类型,值只有 true 和 false(如果变量值为 0 就是 false,否则为 true)

举个例子,a=1 b=2 所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false 如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0) 如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立) 如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立) 如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立)

可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)

而 | 和 || 的比较与上类似,不做赘述。

荒城梦呓

荒城梦呓

449***19@qq.com

7年前 (2018-08-26)

#0

chiu

amo***@126.com

68

a++ 与 ++a 区别在于一个后加,一个先加

a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。

++a 则相当于 a+1。

#include <stdio.h> int main(int argc, char **argv) { int a=100; int b=50; // b++; printf("%d,%d\n",a++,++a); printf("%d,%d",b++,++b); return 0; }

运行后输出:

101,102 51,52

若不注释 b++

int main(int argc, char **argv) { int a=100; int b=50; b++; printf("%d,%d\n",a++,++a); printf("%d,%d",b++,++b); return 0; }

则结果为:

101,102 52,53

chiu

amo***@126.com

7年前 (2018-12-21)

#0

你哈怂

853***635@qq.com

225

运算符优先级:

括号成员是老大; // 括号运算符 []() 成员运算符. -> 全体单目排老二; // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、& 乘除余三,加减四; // 这个"余"是指取余运算即% 移位五,关系六; // 移位运算符:<< >> ,关系:> < >= <= 等 等与不等排行七; // 即 == 和 != 位与异或和位或; // 这几个都是位运算: 位与(&)异或(^)位或(|) "三分天下"八九十; 逻辑与,逻辑或; // 逻辑运算符: || 和 && 十一十二紧挨着; // 注意顺序: 优先级(||) 底于 优先级(&&) 条件只比赋值高, // 三目运算符优先级排到 13 位只比赋值运算符和 "," 高 逗号运算最低级! //逗号运算符优先级最低

你哈怂

853***635@qq.com

6年前 (2019-06-13)

#0

已经不认识真了

and***_e@163.com

28

一句话系列。

逻辑是将两个操作值转换成Boolean进行操作。

逻辑与:双真真(双真为真,下同);

逻辑或:单真真;

逻辑非:取反;

没有说明的情况都为假(0)

按位是将两个操作值转换成二进制然后逐位进行操作。

按位与:双真真;

按位或:有真真(有一个真即为真,两个真的情况也属于有一个真);

按位异或:单真真(区别于有真真,两个真的情况不属于单真);

按位是二进制逐位操作,未说明的皆假。

已经不认识真了

and***_e@163.com

6年前 (2019-11-24)

#0

hellolsk

592***785@qq.com

51

c语言中运算符优先级的总结:

初等运算符>单目运算符>算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符

初等运算符有:()、[ ]、->、. (后两者均为结构体成员运算符); 单目运算符有:!、~、++、--、sizeof、&、*; 算术运算符有:*、/、+、-、<<、>>; 关系运算符有:<、<=、>、>=、==、!=、&、^、|;(此栏排列仍有优先级顺序哦); 逻辑运算符有:&&、||; 条件运算符有:?:(即三目运算符); 赋值运算符有:=、+=、-=、*=、/=、%=、>>=、<<=;等

另外,单目运算符的优先级都高于双目运算符。

hellolsk

592***785@qq.com

5年前 (2020-04-15)

#0

Long

uca***long@gmail.com

  参考地址

62

在计算机中,负数以其正值的补码形式表达

什么叫补码呢?这得从原码,反码说起。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 000001015 的原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为 1,得 0;原为 0,得 1。(1 变 0; 0 变 1)

比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010。

称:11111111 11111111 11111111 11111010是 00000000 00000000 00000000 00000101 的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 11111010 和00000000 00000000 00000000 00000101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。

Long

uca***long@gmail.com

  参考地址

4年前 (2021-02-19)

#0

爱学习的小怪兽

151***4397@qq.com

11

"~"运算符

二进制求补运算符(二进制反码运算符、按位反码):对在内存中存储的是补码按位取反(包括符号位)。此时,得到的结果仍为补码,需要进一步转换为原码,得到最终输出信息。

正数的原码、反码、补码是一样的。

对于负数3种码不同:

原码:第一位表示符号位,其余位表示数值。

反码:符号位不变,其余按位取反。

补码:反码加1称为补码。补码=反码+1,反码=补码-1。

1的原码、反码、补码: a = 00000000 00000000 00000000 0000001

~1的补码 b = 11111111 11111111 11111111 11111110

~1的反码 c = b -1 = 11111111 11111111 11111111 11111101

~1的原码 d = 10000000 00000000 00000000 00000010

~1 = -2

0的原码、反码、补码: a = 00000000 00000000 00000000 0000000

~0的补码 b = 11111111 11111111 11111111 11111111

~0的反码 c = b -1 = 11111111 11111111 11111111 11111110

~1的原码 d = 10000000 00000000 00000000 00000001

~0 = -1

爱学习的小怪兽

151***4397@qq.com

2年前 (2023-07-09)

2025-07-01 18:46 点击量:0