首页 / 知识
关于位操作:检查两个整数是否具有相同符号的最简单方法?
2023-04-15 14:26:00

Simplest way to check if two integers have same sign?检查两个整数是否具有相同符号的最简单方法是什么?是否有任何简短的按位技巧可以做到这一点? 怎么了
? 这是一个在 C/C 中工作的版本,它不依赖于整数大小或存在溢出问题(即 x*y>=0 不起作用)
当然,你可以geek out和template:
注意:由于我们使用异或,所以我们希望在符号相同时 LHS 和 RHS 不同,因此对零进行不同的检查。
如果符号相同,则为 1,否则为 0。 我会警惕任何确定整数符号的按位技巧,因为你必须假设这些数字在内部是如何表示的。 几乎 100% 的情况下,整数将作为二进制补码存储,但除非您使用的数据类型可以保证特定的存储格式,否则对系统内部进行假设并不是一个好习惯. 在二进制的恭维中,您可以只检查整数中的最后(最左边)位以确定它是否为负,因此您可以只比较这两个位。这意味着 0 将与正数具有相同的符号,这与大多数语言中实现的符号函数不一致。 就个人而言,我只会使用您选择的语言的符号功能。这样的计算不太可能出现任何性能问题。 假设 32 位整数:
稍微简洁一点:
我不太确定我会认为"按位技巧"和"最简单"是同义词。我看到很多假设有符号 32 位整数的答案(尽管要求无符号整数会很愚蠢);我不确定它们是否会应用于浮点值。 "最简单"的检查似乎是比较两个值与 0 的比较;假设可以比较类型,这是非常通用的:
如果符号相反,你就错了。如果符号相同,则为真。 (integer1 * integer2) > 0 因为当两个整数共用一个符号时,相乘的结果总是正的。 如果您想将 0 视为同一个符号,也可以使其 >= 0。 假设二进制补码算术(http://en.wikipedia.org/wiki/Two_complement):
在经过优化的现代处理器上,这可能只需要两条指令,不到 1ns。 不假设二进制补码算术:
这可能需要一到两个额外的说明并且需要更长的时间。 使用乘法是个坏主意,因为它容易溢出。 如果 (x * y) > 0... 假设非零等。 作为技术说明,即使在现代架构上,位复杂的解决方案也将比乘法高效得多。你只节省了大约 3 个周期,但你知道他们怎么说"节省了一分钱"... 对于任何大小的 int 和补码运算:
假设为 32 位 ...由于溢出 ,答案 无分支C版:
整数类型的 C 模板:
就在我的头顶......
使用 std::signbit 的更好方法如下:
它还支持其他基本类型(
回想我的大学时代,在大多数机器表示中,整数的最左边不是数字为负数时为 1,为正数时为 0 吗? 不过,我想这是相当依赖机器的。 if (a*b < 0) 符号不同,否则符号相同(或 a 或 b 为零) int same_sign = !( (x >> 31) ^ (y >> 31) ); 如果 (same_sign) ... |
最新内容
相关内容
linux检查硬盘的命令?
linux检查硬盘的命令?,系统,信息,检测,情况,命令,工具,电脑,地址,设备,硬盘,linux查看磁盘空间命令查看磁盘空间-du du命令也是检查硬盘使用情linux检查挂载命令?
linux检查挂载命令?,设备,系统,信息,情况,状态,服务,软件,命令,磁盘,网络,linux查看nas挂载路径1、可以通过以下命令来查看主机是否使用NAS盘:linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux一般检查命令?
linux一般检查命令?,网络,系统,检测,情况,工作,信息,命令,进程,时间,设备,linux查看进程命令linux 下查看进程可以使用的命令:ps命令查找与进程检查硬件linux命令?
检查硬件linux命令?,信息,系统,第一,数据,设备,检测,命令,情况,灵活,实时,如何查看linux系统CPU信息这里我先介绍一个文件。它就是/proc目录文检查路由命令linux?
检查路由命令linux?,网络,地址,系统,信息,工具,电脑,时间,通信,服务,命令,linux为了确定网络层经过的路由器数目应用什么命令1、发现到达目标linux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux分区检查命令是?
linux分区检查命令是?,系统,设备,工具,管理,情况,信息,检测,分区,密码,单位,如何在Linux上分区硬盘1、使用ssh远程连接工具登录到系统,使用fdislinux检查流量的命令?
linux检查流量的命令?,工具,系统,实时,状态,网络,信息,数据,密码,地址,流量,linux如何获得一个进程的网络流量在类Unix系统中可以使用top查看linux检查更新命令是?
linux检查更新命令是?,工作,软件,地址,系统,信息,管理,命令,目录,最新,标准,linux常用命令有哪些linux常用命令如下:查看内核版本:uname-a。控制命令检查linux版本?
命令检查linux版本?,系统,地址,信息,发行,名称,电脑,版本,连续,工具,周期,在Linux命令行下查询当前所使用的shell版本与种类的方法1、一旦你知linux内存检查命令?
linux内存检查命令?,情况,系统,信息,工具,实时,分析,状态,内存,命令,总量,查看Linux系统进程内存占用情况1、linux查看内存使用情况的方法是使