Javascript 如何将任何数字转换为1或-1,并通过位运算符保留符号?
给定任何数字,例如345.678和-345.678,我想要的是将345.678转换为1,-345.678转换为-1。 基本上,我想将任何数字转换为1或-1,符号通过位运算符保留 虽然我不知道为什么,但我可以将任何数字转换为-1,如下所示:Javascript 如何将任何数字转换为1或-1,并通过位运算符保留符号?,javascript,bitwise-operators,Javascript,Bitwise Operators,给定任何数字,例如345.678和-345.678,我想要的是将345.678转换为1,-345.678转换为-1。 基本上,我想将任何数字转换为1或-1,符号通过位运算符保留 虽然我不知道为什么,但我可以将任何数字转换为-1,如下所示: 345.678 | -1 有什么想法吗?对于[-2147483648,+2147483647]间隔中的任何整数N,您可以执行以下操作: (N >> -1) | 1 如果N为负,则结果为-1;如果N为正,则结果为1。 对于零,结果值为1 注: 它
345.678 | -1
有什么想法吗?对于
[-2147483648,+2147483647]
间隔中的任何整数N
,您可以执行以下操作:
(N >> -1) | 1
如果N
为负,则结果为-1;如果N
为正,则结果为1。
对于零,结果值为1
注:
它不适用于区间(-1,0)
(结果值是1而不是-1)中的小数。但是,它应该适用于任何其他十进制数
如果您希望它适用于每一个十进制数,那么解决方法很简单:
(Math.floor( N ) >> -1) | 1
但是你不能只使用位运算符。你可以接受这个问题的想法 并通过按位或而不是按位调整结果,得到
1
而不是0
和-1
而不是1
const sign=x=>(x>>31)| 1;
控制台日志(符号(345.678));
控制台日志(符号(-345.678))代码>是否必须使用位运算来转换和保留符号?为什么不使用像(值>0)这样的简单三值运算?1:-1
?绝对不平凡,因为按位运算符通过切掉最高有效位将64位浮点数转换为32位整数。减1是由二进制中的1组成的,这就是为什么number |-1
的结果总是-1。我怀疑是否有办法使用单位运算符获得符号。检查这个答案这可能对你有用。但它涉及移位和算术运算符。你也可以只做数学。符号,但OP要求进行位运算。乘法和加法不是按位的。我们不清楚是否应该只使用位运算符。但是我会回来一个改进的版本,现在只使用位运算符。number>-1
实际上做什么?它似乎没有移动,除非它是number>>31
的简写形式,-0.345678的结果是错误的,间隔-1
中的任何数字都会得到错误的结果。也就是说,因为按位运算符将值分层,所以较小的值是错误的。
(x >> 31) & 1