首页 > 其他分享 >Rust error : usize 类型不能进行 - 操作

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

时间:2023-12-27 20:45:22浏览次数:38  
标签:arr error 补码 1111 let usize isize Rust

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

相关文章

  • Nextjs SyntaxError: Cannot use import statement outside a module错误
    NextJs报 SyntaxError:Cannotuseimportstatementoutsideamodule第三方依赖不能导入问题 解决方案:1,Next.JS13.1+,可以使用next.config.js中的属性transpilePackagesconstnextConfig={transpilePackages:['the-npm-package'],//第三方的依赖};module.expo......
  • Internal connection fatal error
    Internalconnectionfatalerror错误信息mssql数据库的一个错误。打开mssql数据库连接的时候会报出这个错误。System.InvalidOperationExceptionHResult=0x80131509Message=Internalconnectionfatalerror.Source=System.Data.SqlClientStackTrace:--一大段......
  • k8s 安装kubesphere3.4.1 多次安装报错 Error from server (InternalError): Internal
    failed:[localhost](item={'ns':'kubesphere-system','kind':'users.iam.kubesphere.io','resource':'admin','release':'ks-core'})=>{"ansible_loop_var":"......
  • Windows 安装 Rust 并设置镜像加速
    目录下载rustup-init.exe(Rust安装工具)使用镜像加速rustup安装安装Rust安装标准库源码使用镜像加速cargo包下载安装结果确认更新、卸载和文档查看参考文档下载rustup-init.exe(Rust安装工具)下载安装程序https://www.rust-lang.org/tools/install,我选的是64位:使用镜像加速rustu......
  • 解决前端vue2报错 Error: Can't resolve cache-loader和Error: Can't resolve babel-l
    总得说来报这种Error:Can'tresolve+模块名字的错误,一般就只有两种原因:一、少了这个包(直接安装:pnpmadd-D模块名字@版本),二、有这个包,但是版本在package.json中不正确。需要和你的vue/cli-service的版本对应上,该降级的时候降级,降级一般先删除再安装新的pnpmremovecss-loaderpn......
  • 【HMS Core】{"sub_error":20003,"error_description":"parameter invalid",&
    ​ 【问题描述】离线推送服务端报错{"sub_error":20003,"error_description":"parameterinvalid","error":1101} 【解决方案】错误码1101代表是client_id在系统中不存在,需要检查一下APPID是否配置正确​​......
  • 37. 干货系列从零用Rust编写负载均衡及代理,负载均衡中try_files实现
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • rust call sqlite3 error: linking with `link.exe` failed: exit code: 1181
    rustcallsqlite3error:linkingwithlink.exefailed:exitcode:1181声明:本文禁止csdn.net及所有所有子网站转载。禁止以营利性为目的的转载。报错error:linkingwith`link.exe`failed:exitcode:1181......
  • Windows下使用rust调用SQLite3
    Windows下使用rust调用SQLite3声明:本文禁止csdn.net及所有所有子网站转载。禁止以营利性为目的的转载。userusqlite::{Connection,Result};#[derive(Debug)]structPerson{id:i32,name:String,data:Option<Vec<u8>>,}fnmain()->Result<()>{......
  • rust 过程宏
    简介Rust编程语言里面有两种宏系统,一种是声明宏(DeclarativeMacros),另一种为过程宏(ProceduralMacros)。声明宏和过程宏是两种基本上完全不一样的宏系统,编写的方式也完全不一致,使用方式除了函数式外也不一致。关于声明宏学习,Rust宏小册里面有比较详细的说明,这里不再啰嗦。而对于......