如何使用按位运算符从另一个数字中删除一个数字

本文关键字:数字 删除 一个 运算符 另一个 何使用 | 更新日期: 2023-09-27 18:36:28

如何使用按位运算符从123中删除例如2并返回13?我不知道该怎么做..有可能?提前谢谢。

如何使用按位运算符从另一个数字中删除一个数字

你的建议是可能的,但实际上没有意义。 以下是以位表示的值(仅显示相关位,更左边的所有内容均为零):

2: 000010 || 123: 1111011 || 13: 001101

没有合乎逻辑的方法可以通过按位运算将 123 更改为 13。最好将其转换为字符串或字符数组,删除这两个,然后将其转换回 int。

还有哪些情况?如果存在某种模式,则可以在整数级别对此进行概括,否则您实际上只是在查看字符串替换。

123中的2实际上是2E1 (10100)的,而1234中的2将是2E2 (11001000)两者都与2 (10)无关,至少在位形式上是这样。此外,需要将已删除号码右侧的"数字"添加到已删除号码/10左侧的数字中。

即,从 123 到 13:

Located "2".
Number on left (x): 100
Number on right (y): 3
y + (x / 10) = 13

并从 1324 年到 134

Located "2"
Number on left (x): 1300
Number on right (y): 4
y + (x / 10) = 134

除非有一些模式(即你知道数字在什么位置),否则你只需要.ToString()数字,然后做一个.Replace("2", ""),然后再对结果进行int.Parse()

编辑:有人投票支持这个答案,我意识到我以前的实现不必要地复杂。"迭代"以 10 为基数的数字相对简单,不需要递归。

下面的新解决方案,性能更好,但这是一个巨大的微优化:

static int OmitDigit(int number, int digit) {
    var output = 0;
    var multiplier = 1;
    
    while (number > 0) {
        var n = number % 10;
        number /= 10;
        
        if (n != digit) {
            output += (n * multiplier);
            multiplier *= 10;
        }
    }
    
    return output;
}

结果: 1554443

由于我们使用的是基数为 10 的数字,因此至少可以说,以 2 为基数的操作是丑陋的。使用一些数学,从 k 中删除第 n 位数字,然后移位是

(k/pow(10,n))*pow(10, n-1) + k%pow(10, n-1)

在基数2中,<<>>运算符的作用类似于乘以pow(2, n),而带有掩码的&%的工作,但在基数10中,位不对齐。

这很尴尬,但如果你真的必须只有按位运算,我建议你将数字转换为 BCD。进入 BCD 后,您基本上有一个十六进制数,其数字介于 0 和 9 之间,因此删除数字非常简单。完成后,转换回二进制。

我不相信有人会想这样做。