本文将为您提供关于解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?的详细介绍,同时,我们还将为您提供关于1021:三个整数的最大值、7大运算符:(算数运算符,比较
本文将为您提供关于解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?的详细介绍,同时,我们还将为您提供关于1021: 三个整数的最大值、7大运算符:(算数运算符,比较运算符,赋值运算符,成员运算符,身份运算符,逻辑运算符,位运算符)与其优先级关系、c – 使用if else进行对象比较运算符重载、c – 在一个呼叫中实现其他比较运算符的实用信息。
本文目录一览:- 解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?
- 1021: 三个整数的最大值
- 7大运算符:(算数运算符,比较运算符,赋值运算符,成员运算符,身份运算符,逻辑运算符,位运算符)与其优先级关系
- c – 使用if else进行对象比较运算符重载
- c – 在一个呼叫中实现其他比较运算符
解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?
查找两个数字的最大值。您不应使用if-else或任何其他比较运算符。我在在线公告板上发现了这个问题,所以我认为我应该在StackOverflow中询问
示例输入:5、10输出:10
我找到了这个解决方案,有人可以帮我理解这些代码行吗
int getMax(int a, int b) { int c = a - b; int k = (c >> 31) & 0x1; int max = a - k * c; return max; }
答案1
小编典典int getMax(int a, int b) { int c = a - b; int k = (c >> 31) & 0x1; int max = a - k * c; return max;}
让我们对此进行剖析。第一行看起来很简单-它存储了a
和的差b
。如果为负,则该值为a < b
负;否则为非负。其实这里有一个错误-
如果数字的差异a
,并b
是如此之大,它不适合到一个整数,这将导致不确定的行为-哎呀!因此,我们假设这里不会发生这种情况。
在下一行中
int k = (c >> 31) & 0x1;
想法是检查的值是否c
为负。在几乎所有现代计算机中,数字都是以 二进制补码
的格式存储的,如果数字为正,则数字的最高位为0,如果数字为负,则数字的最高位为1。此外,大多数整数都是32位。 (c >>31)
将数字向下移动31位,将数字的最高位保留在最低位。取该数字并将其与1(其二进制表示除最后一位以外的所有地方均为0)进行下一步的操作将擦除所有较高位,并为您提供最低位。由于的最低位`c
31
是的最高位
c,因此读取的最高位
c为0或1。由于最高位是1,当iff
c为1时,这是一种检查是否为
c是负数(1)还是正数(0)。将此推理与上述内容结合使用,
k如果为1 ,则为1
a < b`,否则为0。
最后一步是这样做:
int max = a - k * c;
如果a < b
,则k == 1
和k * c = c = a - b
,依此类推
a - k * c = a - (a - b) = a - a + b = b
自以来,这是正确的最大值a < b
。否则,如果a >= b
,则k == 0
和
a - k * c = a - 0 = a
这也是正确的最高
1021: 三个整数的最大值
从键盘输入三个整数x,y和z,求出其中最大的数。
输入三个整数,用空格隔开。
输出最大整数。
20 16 18
20
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 int main()
5 {
6 int x, y, z,max;
7 scanf("%d %d %d",&x,&y,&z);
8 if (x > y) {
9 max = x;
10 }
11 else {
12 max = y;
13 }
14 if (z > max) {
15 max = z;
16 }
17 printf("%d",max);
18 return 0;
19 }
原文出处:https://www.cnblogs.com/wangmengru/p/11390396.html
7大运算符:(算数运算符,比较运算符,赋值运算符,成员运算符,身份运算符,逻辑运算符,位运算符)与其优先级关系
一,运算符(7种算数运算符,比较运算符,赋值运算符,成员运算符,身份运算符,逻辑运算符,位运算符)
优先级:
(1) 个别运算符:
优先级最高 ** 幂运算
优先级最低 = 赋值运算符
() 括号可以提升运算优先级
(2) 整体 一元运算符 > 二元运算符
一元运算符: 同一时间,只操作一个值 - ~
二元运算符: 同一时间,操作两个值 + - * / ...
(3) 同一层级
逻辑: () > not > and > or
算数: 乘除 > 加减
位运算符: ( << >> ) > & > ^ > |
(4) 其他运算符
算数运算符 > 位运算符 > 比较运算符 > 身份运算符> 成员运算符 > 逻辑运算符
赋值运算符是最后算完进行赋值,做收尾工作的.
"""
res = 5+5 << 6//3 is 40 and True
print(res)
"""
res = 10 << 2 is 40 and True
res = 40 is 40 and True
res = True and True
res = True
"""
# 加上括号包起来,让别人能看懂代码;
res = (5+5) << (6//3) is 40 and True
(1)算术运算符 + - * / // % **
var2 = 4
# +
res = var1 + var2
print(res)
# -
res = var1 - var2
print(res)
# *
res = var1 * var2
print(res)
# / 除法 (结果为小数)
res = var1 / var2
res = 10 / 5
print(res)
# // 地板除 (返回整数)
res = 10 // 5
res = 11 // 4
print(res)
# 如果被除数或者除数是一个小数,结果加上.0
res = 11.0 // 4
print(res)
# % 取余
res = 11 % 4
res = -11 % 4 # -3 + 4 = 1
res = 11 % -4 # 3 + (-4) = -1
res = -11 % -4 # -3(如果被除数和除数都是负数,在正常得到的结果前面填上负号即可.)
print(res)
res = -17 % 7 # -3 + 7 = 4
res = 17 % -7 # 3 + (-7) = -4
res = -17 % -7 #-3
print(res)
# ** 幂运算
res = 3 ** 2
res = 3 ** 4
print(res)
(2)比较运算符> < >= <= == !=
比较运算符只会差生两种结果: True 真的 ,False 假的
var1 = 100
var2 = 100
res = var1 > var2
res = var1 < var2
res = var1 >= var2
res = var1 <= var2
print(res)
# 注意点
res = var1 == var2
print(res)
(3)赋值运算符
= += -= *= /= //= %= **=
# = 从右向左,将右侧的值赋值给左侧变量
var1 = 9
var2 = 2
# +=
"""var1 = var1 + var2"""
# var1 += var2
# print(var1)
# -=
"""var1 = var1 - var2"""
# var1 -= var2
# print(var1)
# *=
"""var1 = var1 * var2"""
# var1 *= var2
# print(var1)
# /=
"""var1 = var1 / var2"""
# var1 /= var2
# print(var1)
# //=
"""var1 = var1 // var2"""
# var1 //= var2
# print(var1)
# %=
"""var1 = var1 % var2"""
# var1 %= var2
# print(var1)
# **=
"""var1 = var1 ** var2"""
var1 **= var2
print(var1)
(4)成员运算符:in 和 not in (针对于容器类型数据)
strvar = "雷霆嘎巴,无情哈拉少"
res = "雷" in strvar
res = "文" not in strvar
res = "无情" in strvar
res = "霆哈少" in strvar
res = '','' not in strvar
print(res)
# list tuple set
lst = ["余锐","高学峰","治理追","温子月","草神光"]
res = "高学峰" in lst
print(res)
tup = ("余锐","高学峰","治理追","温子月","草神光")
res = "李博伦" not in tup
print(res)
setvar = {"金角大王","银角大王","神秘男孩"}
res = "神秘男孩" in setvar
print(res)
# dict
""" in 和 not in 在字典中只判断键,不判断值 """
dic = {"yr":"英俊帅气","bx":"抠脚大汉","mcp":"高大威猛"}
res = "英俊帅气" in dic # False
res = "yr" in dic
res = "mcp" not in dic
print(res)
(5)身份运算符: is和 is not(检测两个数据在内存当中是否是同一个值)
""" 字符串必须是一个连续的片段 """
strvar = "雷霆嘎巴,无情哈拉少"
res = "雷" in strvar
res = "文" not in strvar
res = "无情" in strvar
res = "霆哈少" in strvar
res = '','' not in strvar
print(res)
# list tuple set
lst = ["余锐","高学峰","治理追","温子月","草神光"]
res = "高学峰" in lst
print(res)
tup = ("余锐","高学峰","治理追","温子月","草神光")
res = "李博伦" not in tup
print(res)
setvar = {"金角大王","银角大王","神秘男孩"}
res = "神秘男孩" in setvar
print(res)
# dict
""" in 和 not in 在字典中只判断键,不判断值 """
dic = {"yr":"英俊帅气","bx":"抠脚大汉","mcp":"高大威猛"}
res = "英俊帅气" in dic # False
res = "yr" in dic
res = "mcp" not in dic
print(res)
(6)逻辑运算符: and or not
# and 逻辑与
"""全真则真,一假则假"""
res = True and True # True
res = True and False # False
res = False and True # False
res = False and False # False
print(res)
# or 逻辑或
"""全假则假,一真则真"""
res = True or True # True
res = True or False # True
res = False or True # True
res = False or False # False
print(res)
# not 逻辑非
"""真变假,假变真"""
res = not True
res = not False
print(res)
# 逻辑短路: 如果出现了短路效果,后面的代码不执行
"""
短路:
(1) True or 表达式
(2) False and 表达式
"""
"""
True or print("紫月真胖呀")
True or True => True
True or False => True
False and print("紫月真猛呀")
False and False => False
False and True => False
"""
"""
bool 类型为假的十种情况
0 0.0 0j False '''' [] () {} set() None
先用大脑算一下布尔值真假,是否出现短路情况
如果出现了直接返回当前值,没出现,继续向右执行;
"""
res = 5 or 6
res = 0 or 6
res = 0 and 9
print(res)
逻辑运算符的优先级
() > not > and > or
eg:
res = 5 or 6 and 7 # 5 or 7 => 5
res = (5 or 6) and 7 # 5 and 7 => 7
res = not(5 or 6) and 7 # not 5 and 7 => False and 7 =>False
print(res)
res = 1>2 or 3<4 and 5>10 or 11<12 and 13>15 or 100<1000 and 1<2
# res = False or True and False or True and False or True and True
# res = False or False or False or True
# res = False or False or True
# res = False or True
# res = True
print(res)
(7)位运算符 & | ^ << >> ~
# 按位与 &
var1 = 19
var2 = 15
print(var1 & var2)
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111
0000 ... 10011
0000 ... 01111
0000 ... 00011 => 3
"""
# 按位或 |
var1 = 19
var2 = 15
print(var1 | var2)
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111
0000 ... 10011
0000 ... 01111
0000 ... 11111 => 31
"""
# 按位异或 ^ 两个值不一样,返回真,否则返回假
"""
1 0 => 1
1 1 => 0
0 0 => 0
0 1 => 1
"""
var1 = 19
var2 = 15
print(var1 ^ var2)
"""
19的二进制
0000 ... 10011
15的二进制
0000 ... 01111
0000 ... 10011
0000 ... 01111
0000 ... 11100 => 28
"""
# << 左移
""" 左移相当于做乘法 : 5 * 2的n次幂 """
res = 5 << 1 # 10
res = 5 << 2 # 20
res = 5 << 3 # 40
print(res)
"""
0000 ... 101
0000 ... 1010 移动一位 10
0000 10100 移动二位 20
"""
# >> 右移
""" 右移相当于做除法 : 5 // 2的n次幂 """
res = 5 >> 1 # 2
res = 5 >> 2 # 1
res = 5 >> 3 # 0
print(res)
"""
0000 ... 101
0000 ... 010 移动一位 2
0000 ... 001 移动二位 1
0000 ... 000 移动三位 0
"""
# ~ 按位非 (针对于补码进行操作,按位取反,包括符号位)
"""公式: -(n+1)"""
var1 = ~19
print(var1)
"""
~ 按位非每一位都取反,包括符号位,求反码每一位除了符号位,都取反.
原码:0000 ... 10011
反码:0000 ... 10011
补码:0000 ... 10011
补码: 0000 ... 10011
按位非: 1111 ... 01100
给你补码求原码:
补码: 1111 ... 01100
反码: 1000 ... 10011
原码: 1000 ... 10100 => -20
"""
var1 = ~(-22)
print(var1)
"""
原码: 1000 ... 10011
反码: 1111 ... 01100
补码: 1111 ... 01101
补码: 1111 ... 01101
按位非: 0000 ... 10010
给你补码求原码:
正数 : 补码 = 反码 = 原码
原码: 0000 ... 10010 => 18
"""
c – 使用if else进行对象比较运算符重载
class Student { int iRollNumber; int iSection; int iMarks; }
>我想与iRollNumber,iSection,iMarks(独立)进行比较.
>我想与iRollNumber,iSection(Combined)进行比较.
>我想与iMarks,iSection(Combined)进行比较.
> ……….
目前我正在使用getmethods()实现这一点,并使用if elseif elseif …结构来比较它们.
这导致到处乱码!
如果我使用运算符重载,我必须决定一种比较方式.
请建议一种优雅的编码方式.
要么
是否可以调用运算符重载多态?
解决方法
int CompareR( const Student & a,const Student & b ); int CompareS( const Student & a,const Student & b ); int CompareM( const Student & a,const Student & b ); int CompareRS( const Student & a,const Student & b ); int CompareMS( const Student & a,const Student & b );
虽然在课堂上进行这么多不同类型的比较的需要有点不寻常 – 你通常只需要一个或两个.函数应返回与strcmp()相同的值:
< returns -1 == returns 0 > returns 1
c – 在一个呼叫中实现其他比较运算符
解决方法
> a< = b ==!(b< a)
> a> = b ==!(a< b)
甚至有可能在少于(在这里滥用我的元语法的种类)实现平等:
>(a == b)==(!(a< b)&&!(b< a))>(a!= b)==(a< b || b< a) 虽然我不建议在实践中这样做,因为它需要两次比较,通常可以直接更有效地实施.
今天关于解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?的介绍到此结束,谢谢您的阅读,有关1021: 三个整数的最大值、7大运算符:(算数运算符,比较运算符,赋值运算符,成员运算符,身份运算符,逻辑运算符,位运算符)与其优先级关系、c – 使用if else进行对象比较运算符重载、c – 在一个呼叫中实现其他比较运算符等更多相关知识的信息可以在本站进行查询。
本文标签: