如何通过位操作检查 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
我需要检查 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