V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fly2mars
V2EX  ›  问与答

如何声明一个需要位运算的变量? 比如 x & 1 = 1,int x = ??

  •  
  •   fly2mars · 326 天前 · 1089 次点击
    这是一个创建于 326 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果 x * 2 = 2,那么可以 int x = 2/2;

    现在问题是
    如果 x & 1 = 1,怎么把 x 申明出来, int x = ??
    21 条回复    2021-06-28 16:56:26 +08:00
    shpkng
        1
    shpkng  
       326 天前
    与运算没有逆运算,所以这个没法写
    fly2mars
        2
    fly2mars  
    OP
       326 天前
    @shpkng 那请问有啥工具类可以完成这个需求吗 这个变量是用来表示多种状态的
    zxCoder
        3
    zxCoder  
       326 天前
    这个 x 可能很多个值。。。。什么叫做申明出来
    fly2mars
        4
    fly2mars  
    OP
       326 天前
    @zxCoder 就是因为有多个值,所以要申明出来 int x = (表达式),这样表示一个变量,这个变量在其他地方使用
    zxCoder
        5
    zxCoder  
       326 天前
    @fly2mars 没懂。。。 你这样写 x 只能是一个值啊
    guoqiao
        6
    guoqiao  
       326 天前
    x & 1 = 1, 那难道不是任意奇数都可以吗?所以 x = 2 * n + 1.
    TomVista
        7
    TomVista  
       326 天前
    yianing
        8
    yianing  
       326 天前 via Android
    int x = 1 | xxx ?
    GuuJiang
        9
    GuuJiang  
       326 天前 via iPhone   ❤️ 1
    直接说你的原始需求吧,不要再在 XY 问题上浪费时间
    litmxs
        10
    litmxs  
       326 天前 via Android   ❤️ 1
    XY 问题,表达和概述能力捉急的情况下,不如直接把原始问题抛出来。
    fly2mars
        11
    fly2mars  
    OP
       326 天前
    @TomVista 是这个 就是一个字段表示多种状态, 但是这个状态值都是和运算符直接相连的
    如 return (status & value) != 0;这里 status 是满足表达式条件的值

    而我需要的是把这个 status 值用先用一个变量来表示,便于在其他地方使用
    int status = (未知表达式),这个表达式该怎么写
    mekingname
        12
    mekingname  
       326 天前
    为什么不能先直接 int status = null 呢?不知道你用的具体是什么语言。但种子就是初始为空值

    后面使用的时候,先判断 status 是 null 还是数字。如果 null,那么不需要比较,直接返回;如果不是 null,那么说明之前已经被赋值了,此时进行运算

    if status == null {
    return value != 0
    } else {
    return (status & value) != 0
    }
    ahhui
        13
    ahhui  
       326 天前
    @fly2mars 这个 status 不就是二进制全部位为 1 的数字么? 8 位就是 0xFF, 16 位就是 0xFFFF,类推。
    GuuJiang
        14
    GuuJiang  
       326 天前
    @fly2mars 你要的这个不就是普通的 flag 的组合吗?在你举的这个例子里就是
    int x = 1;
    fly2mars
        15
    fly2mars  
    OP
       326 天前
    @mekingname 多谢你的思路 要封装个方法
    fly2mars
        16
    fly2mars  
    OP
       326 天前
    @GuuJiang 还有 3,因为目前的需求只用表示 2^2 种状态,但是后期可能会加成 2^3,2^4 种状态,所以想知道能不能以某种表达式形式来表示多个符合的值
    paxol
        17
    paxol  
       326 天前
    @fly2mars 数学层面上这就是没办法实现的,与运算丢失了信息,没办法还原。看它的真值表就知道了。
    如果是 flag 的用法,应该用“逻辑或”置 1 。变量初始化为 0,需要把哪一位置 1 就 or (1<<bit) ( bit 从最右边 0 开始计数)。比如 A=xxxxxxxxb ( 1Byte flag ),想要得到 A'=xxxxxx1xb,则 A'=A | 00000010b 即可。这个过程不会影响其他 bit 的值。
    GuuJiang
        18
    GuuJiang  
       326 天前
    @fly2mars 我觉得你一定是在某个地方存在某种误解
    举个例子,x^2=1(此处是指平方而不是异或),那么 x 到底是 1 还是-1
    数学上要表达一个函数,既可以用显函数方式 y=f(x),也可以用隐函数方式 F(x, y)=0
    诚然,对于单值的情况确实显函数看起来更符合直觉一点,因为人们习惯于“xx 是 xx”这种表达方式,但是对于多值的方式有的时候只能用隐函数(这里对隐函数概念做了推广,严格来说多值的不应该称为函数)
    更哲学一点,定义一个东西既可以用内涵定义(某某是什么),也可以用外延定义(满足什么条件的是某某)
    你想要的是满足(x&1) != 0 的全体整数,并且试图用一个值来表达这个集合,如果硬要表示出来,那么 x 一定不是一个数而是一个集合{1, 3, 5, 7, 9, ...}在这个场景之下,没有比 1 能更简洁的表达这个集合的方式了,推广一下,用 a 来表达全体满足(x&a)!=0 的整数,或者更形式化点,有个带参函数
    F(x,t) => (x & t) != 0
    那么每个 t 都表示了一个集合,换言之,你本身已经有了简洁的表达集合的方式,但是试图去找一种更“简洁”的表示方式,本末倒置了
    GuuJiang
        19
    GuuJiang  
       326 天前
    @fly2mars 虽然你一直没表达清楚,但是可以隐约猜测出来你想要实现的就是要把“满足某种条件的全体元素”这个抽象概念变成一个具体的概念,可以赋值给变量,可以作为参数传递,可以作为返回值返回,这种“把抽象的东西当成具体的东西来传递”的通用做法是使用高阶函数,当然这里我不打算提,否则你会更晕的,具体到你这个例子里,你只需要使用
    int x = 1 来表示“全体满足(x&1)!=0 的数”
    int x = 2 来表示“全体满足(x&2)!=0 的数”
    ...
    即可,只不过在凡是用到这个变量的地方都要牢记它表示的其实不是一个数而是一个集合,对它能做的运算也只有有限的几种,在只关系集合这个整体的地方,就原样传递这个变量即可,等到了真正需要列举出元素或者测试某个值是否属于这个集合的地方,再使用运算(x&a)!=0
    fly2mars
        20
    fly2mars  
    OP
       325 天前
    @GuuJiang 学习了,多谢哈,就是想用显函数且一个变量来表示这个集合
    HiShan
        21
    HiShan  
       325 天前
    函数式编程 柯里化 ?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3312 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 05:28 · PVG 13:28 · LAX 22:28 · JFK 01:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.