如何通过位操作检查 x int 是否从 y int 开始?

How to check if x int start from y int via bits operations?

我需要检查 x int 是否从其他 (y) int 开始,例如:

1) input: x = 1250; y = 12 output: True

2) input: x = 2500; y = 250 output: True

3) input: x = 22; y = 21 output: False

4) input: x = 150; y = 11 output: False

而且我不知道该怎么做。

我尝试过使用 & 运算符,但这还不够:

let result = y & x
if result == y {
    print("good")
}

如何使用位运算而不是字符串来检查它?

你不能通过位操作来做到这一点,就像@ForceBru 在评论中提到的那样。

你可以不使用字符串来做到这一点:只需计算两个数字的位数,然后 "cut" 更大的数字,然后比较这些数字是否相等:

func checkPrefix(_ prefix: Int, for number: Int) -> Bool {
    let digitsDiff = digits(for: number) - digits(for: prefix)

    if digitsDiff <= 0 {
        return false
    }

    let digitsDiffPower = pow(10, Double(digitsDiff))

    return number / Int(digitsDiffPower) == prefix
}

func digits(for number: Int) -> Int {
    var num = number
    var count = 0
    while num != 0 {
        count += 1
        num = num / 10
    }
    return count
}

它像你描述的那样工作:

print(checkPrefix(12, for: 1250)) // prints: true
print(checkPrefix(250, for: 2500)) // prints: true
print(checkPrefix(21, for: 22)) // prints: false
print(checkPrefix(11, for: 150)) // prints: false

本着您评论的精神,即使用哪种语言并不重要,这里有一个懒惰的 C# 实现(如果您#include <stdbool.h>,它将移植到 C),它依赖于整数除法这一事实returns 一个 int:

bool CheckPrefix(int x, int y)
{
    while (y > x)
        if ((y /= 10) == x)
            return true;
    return false;
}

在 C# 中:

Console.WriteLine(CheckPrefix(12, 1250));
Console.WriteLine(CheckPrefix(250, 2500));
Console.WriteLine(CheckPrefix(21, 22));
Console.WriteLine(CheckPrefix(11, 150));

输出:

True
True
False
False

在 C:

printf("%s", CheckPrefix(12, 1250) ? "true" : "false");
printf("%s", CheckPrefix(250, 2500) ? "true" : "false");
printf("%s", CheckPrefix(21, 22) ? "true" : "false");
printf("%s", CheckPrefix(11, 150) ? "true" : "false");

输出:

truetruefalsefalse