return (- low - 1 as isize) as isize;
cannot apply unary operator -
Rust编写程序时候 usize 类型 进行-1 运算时报的错误
写了下BinarySearch, 对于if 判断修正为平衡版本,同时解决了 取得的midVal 已经获取其下标,不必等其缩小完边界。
以下是第一种较差的实现方式。
fn binary_search_strong<T>(arr : &[T] , target : T) -> isize
where
T : Copy + PartialOrd +Display
{
let (mut left , mut right) = ( 0 , arr.len());
let mut mid = (left + right) >>1;
while 1 < (right - left) {
if arr[mid] > target {
right = mid;
}else {
left = mid;
}
mid = (right + left ) >> 1;
}
if(arr[left] == target){
return left as isize;
}
return -1;
}
第二种改良版
fn binary_search_JDK<T>(arr : &[T] , target : T) -> isize
where
T : Copy + PartialOrd
{
let mut low = 0 ;
let mut high = arr.len() -1 ;
while low<=high {
let mid = (low + high) >> 1;
let midVal = arr[mid];
if midVal < target{
low = mid + 1;
}else { // midVal >= target
if arr[mid] <= target{
return mid as isize;
}
high = mid - 1;
}
}
return !low as isize;
// return (- low - 1 as isize) as isize;
/*
> src\main.rs:39:13
|
39 | return (- low - 1 as isize) as isize;
| ^^^^^ cannot apply unary operator `-`
|
= note: unsigned values cannot be negated
*/
}
但在进行取反-1 的操作中碰到了, low (usize)类型不能适用于 unary operator ·-· ,
此处为笔者找到解决方案的地址 : rust - 无法将一元运算符 -
应用于类型 usize
- IT工具网 (coder.work)
在 Rust 中,一元否定运算符不再可用于无符号整数类型。相反,您应该使用按位非运算符(写成 !
,而不是 C 语言中的 ~
)。
在二进制补码中,这两个运算符之间存在直接等价关系:!x == -(x + 1)
。具体来说,-1
的等效项是 !0
。因此,你可以这样写:
Number :在计算机中,整数类型通常采用补码形式进行存储和表示。这是因为补码表示法可以方便地进行加减运算,并且可以用一个字节(byte)内表示从-128到127的所有整数。对于Number
类型,它通常采用IEEE 754标准表示法,该标准也是基于补码表示法的。
不是所有的数据在计算机中都是以补码形式存在的。计算机中存储和表示的数据有多种形式,其中最常见的是补码表示法,主要用于数值的存储和计算。但除了补码,还有其他的数据表示形式,例如ASCII码、十六进制数、文本等。这些数据表示形式都有自己的特点和用途,适用于不同的数据类型和需求。
因此,不是所有的数据在计算机中都是以补码形式存在的,补码只是其中一种常用的数据表示形式。
二进制补码形式:
0000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
补码--> 原码 --> 十进制 ,绝对值的二进制形式的取反(即按位取反)然后加1
!0 == -(0+1)
本错误记录 usize -1 , 对于usize类型想要进行 - 操作,详见rust - 为什么对 usize 数字的减号操作不能为负数,以及 Rust 惯用的处理方法是什么? - IT工具网 (coder.work) 。 也就是提前进行类型转换
let a: usize = 1;
let b = a as isize - 2;
/*
let b = a - 2;
| ^^^^^ attempt to compute `1_usize - 2_usize`, which would overflow
*/
return -( low as isize) - 1;
标签:arr,error,补码,1111,let,usize,isize,Rust From: https://www.cnblogs.com/lartimes/p/17931368.html