添加位,更简单
Adding bits, simpler
考虑到以字符串的形式提供了两个bitset,char a[]
和char b[]
,如下面的代码。并给出了添加该位集的任务。我接受并写了以下内容来总结两个位集:
#include <stdio.h>
#include <string.h>
int carry = 0;
char result(char r, int c) {
char R = '0';
if (carry) {
if (c) {
R = '0';
carry = 1;
} else {
R = r == '0' ? '1' : '0';
carry = R == '0' ? 1 : 0;
}
} else {
if (c) {
R = '0';
carry = 1;
} else {
R = r;
carry = 0;
}
}
return R;
}
char sum(int x, int y) {
char r = '0';
if (x ^ y)
r = result('1', 0);
else if (x & y)
r = result('0', 1);
else
r = result('0', 0);
return r;
}
int main() {
char a[] = "01";
char b[] = "01";
char c[] = "00";
for (int i = strlen(c)-1; i > -1; i--)
c[i] = sum(a[i] == '0' ? 0 : 1, b[i] == '0' ? 0 : 1);
printf("%s\n", c);
}
是否可以简化它?
#include <stdio.h>
#include <string.h>
void sum_two_charbitsets(int char_count,char*a,char*b,char*result)
{
int x,i,carry = 0;
for(i = char_count-1; i >= 0; i--)
{
x=(a[i]-'0')+(b[i]-'0')+carry;
result[i]=(x&1)+'0';
carry=x>>1;
}
}
int main(int argc, char *argv[])
{
char a[] = "01";
char b[] = "01";
char c[] = "00";
sum_two_charbitsets(2,a,b,c);
printf("%s\n", c);
}
在进行数值运算时,为什么不使用数字而不是充满字符串比较之类的难以阅读的代码?
为了使用数字加运算符,我通过 subtracting/adding char '0' 的 ASCII 数字使用简单的 char<->int 转换。只要字符串只包含预期的字符“0”或“1”,它就可以工作。
number&1
用于使用二进制 AND 运算符从整数中减去第一位。
number>>1
是二进制移位运算符,它将丢弃第一位,将第二位移动到第一位 => 有效地减去它。 (只要没有设置其他位,正确的输入数据就不会发生这种情况)
考虑到以字符串的形式提供了两个bitset,char a[]
和char b[]
,如下面的代码。并给出了添加该位集的任务。我接受并写了以下内容来总结两个位集:
#include <stdio.h>
#include <string.h>
int carry = 0;
char result(char r, int c) {
char R = '0';
if (carry) {
if (c) {
R = '0';
carry = 1;
} else {
R = r == '0' ? '1' : '0';
carry = R == '0' ? 1 : 0;
}
} else {
if (c) {
R = '0';
carry = 1;
} else {
R = r;
carry = 0;
}
}
return R;
}
char sum(int x, int y) {
char r = '0';
if (x ^ y)
r = result('1', 0);
else if (x & y)
r = result('0', 1);
else
r = result('0', 0);
return r;
}
int main() {
char a[] = "01";
char b[] = "01";
char c[] = "00";
for (int i = strlen(c)-1; i > -1; i--)
c[i] = sum(a[i] == '0' ? 0 : 1, b[i] == '0' ? 0 : 1);
printf("%s\n", c);
}
是否可以简化它?
#include <stdio.h>
#include <string.h>
void sum_two_charbitsets(int char_count,char*a,char*b,char*result)
{
int x,i,carry = 0;
for(i = char_count-1; i >= 0; i--)
{
x=(a[i]-'0')+(b[i]-'0')+carry;
result[i]=(x&1)+'0';
carry=x>>1;
}
}
int main(int argc, char *argv[])
{
char a[] = "01";
char b[] = "01";
char c[] = "00";
sum_two_charbitsets(2,a,b,c);
printf("%s\n", c);
}
在进行数值运算时,为什么不使用数字而不是充满字符串比较之类的难以阅读的代码?
为了使用数字加运算符,我通过 subtracting/adding char '0' 的 ASCII 数字使用简单的 char<->int 转换。只要字符串只包含预期的字符“0”或“1”,它就可以工作。
number&1
用于使用二进制 AND 运算符从整数中减去第一位。
number>>1
是二进制移位运算符,它将丢弃第一位,将第二位移动到第一位 => 有效地减去它。 (只要没有设置其他位,正确的输入数据就不会发生这种情况)