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

时间:2012-06-08 04:31:48

标签: c# c bit-manipulation

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

4 个答案:

答案 0 :(得分:3)

你所建议的是可能的,但这样做并没有多大意义。以下是以位为单位的值表示(仅显示相关位,剩下的所有内容均为零):

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

使用按位运算将123更改为13是没有逻辑方法的。最好把它变成一个字符串或字符数组,删除它们然后再把它转换成一个int。

答案 1 :(得分:1)

还有哪些其他案例?如果存在某种模式,则可以将其概括为整数级别,否则您实际上只是在查看字符串替换。

2中的123实际上是2E1 (10100),而2中的1234将是2E2 (11001000)2 (10)Located "2". Number on left (x): 100 Number on right (y): 3 y + (x / 10) = 13 无关{1}},至少以按位形式。此外,删除号码右侧的“号码”需要添加到已删除号码/ 10左侧的号码中。

即从123到13:

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

从1324到134

.ToString()

除非有某种模式(即你知道数字的位置),否则你需要.Replace("2", "")数字,然后执行int.Parse(),然后才能执行 static int remove_digit(int number, int digit) { int sum = 0; if (number > 0) //can't remove 0, doesn't matter if the "digit" is 0 also. { int factor = 1; int temp = number; while (temp > 0 && temp % 10 != digit) { sum += (temp % 10) * factor; factor *= 10; temp /= 10; } sum += remove_digit(temp / 10, digit) * factor;//recursion to remove any further digits. } return sum; } 结果。

你可能会定义某种递归函数来纯粹以整数形式执行此操作,但是对于.ToString()和int.Parse()

的小开销来说,这是很多工作。

编辑:因为我很无聊,我写了一个递归的“整数”版本。

Console.WriteLine(remove_digit(125254443, 2));

并没有花太多时间来优化代码,因此可能存在一些冗余。随意修改它。

1554443

结果: {{1}}

编辑:修改代码,现在稍快一些。

答案 2 :(得分:0)

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

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

在基数2中,<<>>运算符的行为与pow(2, n)相乘,带&的{​​{1}}执行%的工作,但是在基数10中,这些位不排成一行。

答案 3 :(得分:0)

这很尴尬,但如果你真的必须只进行按位操作,我建议你convert the number to BCD。一旦进入BCD,你基本上有一个十六进制数字,数字在0到9之间,所以删除一个数字非常简单。完成后,转换回二进制文件。

我不相信任何人会想那样做。