没有 "abs" 或 "if" 的 ASCII table 中 2 个字符之间差异的绝对值
absolute value of difference between 2 chars in ASCII table without "abs" or "if"
这是我的代码:
#include <stdio.h>
void main() {
char a, b;
char c;
printf("enter 2 chars: ");
a = getchar();
b = getchar();
c = a - b;
printf("%d",c );
}
我试图找到两个字符之间的绝对值,例如,'A'&'a'=>32
'a'&'A'=>32
我的代码显示否定答案,如果不使用 abs 函数我该怎么办,或者如果我试过这个:
printf("%u",c );
但它给了我 4294967264。有什么简单的方法吗?它应该使用 getchar 和 putchar!
最简单的方法是使用 abs 函数。
printf("%d",abs(c) );
但是如果你不想使用它,你可以试试换行:
c = a - b;
至:
c = (a > b) ? (a-b) : (b - a);
无分支:(假设二进制补码整数表示)
#include <stdio.h>
int main(void)
{
printf("Enter 2 chars: ");
char a = getchar();
char b = getchar();
char c = a - b;
c = (c^-(c < 0)) + (c < 0);
printf("%d\n", c);
}
分成几块:
当 c
为正数时,(c < 0)
给出 0
:
c = (c^-0) + 0
~> c = c^0
... $foo XOR 0 给出 $foo
c = c
无事可做。
当 c
为负数时,(c < 0)
给出 1
:
c = (c^-1) + 1
... -1
二进制补码中的所有位都已设置 (~0
)
c = (c^(~0)) + 1
... 二进制补码 XOR ~0
中的负数 c
给出 -c - 1
c = -c - 1 + 1
~> c = -c
gcc 8.3 -O3:(cl v15.9.0-pre.3.0 生成等效程序集)
mov edx, edi ; edx = c
shr edx, 31 ; right shift, keep only the sign bit (c < 0) [sign]
mov eax, edx ; eax = [sign]
neg eax ; eax = -[sign]
xor eax, edi ; eax = -[sign] xor c
add eax, edx ; eax += [sign]
这是我的代码:
#include <stdio.h>
void main() {
char a, b;
char c;
printf("enter 2 chars: ");
a = getchar();
b = getchar();
c = a - b;
printf("%d",c );
}
我试图找到两个字符之间的绝对值,例如,'A'&'a'=>32 'a'&'A'=>32 我的代码显示否定答案,如果不使用 abs 函数我该怎么办,或者如果我试过这个:
printf("%u",c );
但它给了我 4294967264。有什么简单的方法吗?它应该使用 getchar 和 putchar!
最简单的方法是使用 abs 函数。
printf("%d",abs(c) );
但是如果你不想使用它,你可以试试换行:
c = a - b;
至:
c = (a > b) ? (a-b) : (b - a);
无分支:(假设二进制补码整数表示)
#include <stdio.h>
int main(void)
{
printf("Enter 2 chars: ");
char a = getchar();
char b = getchar();
char c = a - b;
c = (c^-(c < 0)) + (c < 0);
printf("%d\n", c);
}
分成几块:
当c
为正数时,(c < 0)
给出 0
:
c = (c^-0) + 0
~> c = c^0
... $foo XOR 0 给出 $foo
c = c
无事可做。
当 c
为负数时,(c < 0)
给出 1
:
c = (c^-1) + 1
... -1
二进制补码中的所有位都已设置 (~0
)
c = (c^(~0)) + 1
... 二进制补码 XOR ~0
中的负数 c
给出 -c - 1
c = -c - 1 + 1
~> c = -c
gcc 8.3 -O3:(cl v15.9.0-pre.3.0 生成等效程序集)
mov edx, edi ; edx = c
shr edx, 31 ; right shift, keep only the sign bit (c < 0) [sign]
mov eax, edx ; eax = [sign]
neg eax ; eax = -[sign]
xor eax, edi ; eax = -[sign] xor c
add eax, edx ; eax += [sign]