如何使用按位运算符从另一个数字中删除一个数字
本文关键字:数字 删除 一个 运算符 另一个 何使用 | 更新日期: 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 之间,因此删除数字非常简单。完成后,转换回二进制。
我不相信有人会想这样做。