编写此代码片段的有效方法?
An efficient way to write this code snippet?
如何更有效地重写此代码and/or 以节省字节并显得不那么冗长?
if(N % 2 == 0 && (N == 6 || N == 8 || N == 10 || N == 12 || N == 14 || N== 16 || N == 18 || N == 20 ))
{
printf("Weird\n");
}
鉴于语言是 C,尽管它是 java 或 php 或任何其他语言并不重要 :-)。
给定 N 是无符号整数。
if(N % 2 == 0 && (N-6) <= 14)
{
printf("Weird\n");
}
你为什么不这样做:
if (N % 2 == 0 && (N >= 6 && N <= 20))
{
/* ... */
}
假设 N
有一个无符号整数类型,而你更感兴趣的是最小源代码而不是清晰度,那么你可能会写
if (((N - 6) & 14) + 6 == N) {
printf("Weird\n");
}
解释:
第一个操作 N - 6
将可接受值的范围从 6
- 20
移动到 0
- 14
。后面的范围可以用四位表示。
第二个运算 & 14
是位模式 1110
的按位 和 。这将使 0
- 14
范围内的偶数保持不变,但它会将奇数转换为偶数并清除任何更高的位。唯一不变的值是从第一步中的原始目标值导出的值。
第三次运算与第一次相反,这样就可以直接和原来的数进行比较了。如果组合的操作序列重现了原始数字,那么该数字就是您要查找的数字之一。
如何更有效地重写此代码and/or 以节省字节并显得不那么冗长?
if(N % 2 == 0 && (N == 6 || N == 8 || N == 10 || N == 12 || N == 14 || N== 16 || N == 18 || N == 20 ))
{
printf("Weird\n");
}
鉴于语言是 C,尽管它是 java 或 php 或任何其他语言并不重要 :-)。
给定 N 是无符号整数。
if(N % 2 == 0 && (N-6) <= 14)
{
printf("Weird\n");
}
你为什么不这样做:
if (N % 2 == 0 && (N >= 6 && N <= 20))
{
/* ... */
}
假设 N
有一个无符号整数类型,而你更感兴趣的是最小源代码而不是清晰度,那么你可能会写
if (((N - 6) & 14) + 6 == N) {
printf("Weird\n");
}
解释:
第一个操作 N - 6
将可接受值的范围从 6
- 20
移动到 0
- 14
。后面的范围可以用四位表示。
第二个运算 & 14
是位模式 1110
的按位 和 。这将使 0
- 14
范围内的偶数保持不变,但它会将奇数转换为偶数并清除任何更高的位。唯一不变的值是从第一步中的原始目标值导出的值。
第三次运算与第一次相反,这样就可以直接和原来的数进行比较了。如果组合的操作序列重现了原始数字,那么该数字就是您要查找的数字之一。