Rust error : usize 类型不能进行 - 操作

发布时间 2023-12-27 20:34:36作者: lartimes

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;