C 用位移位和增量实现减法
是否有一种算法可以用来从一个数字中减去1,只需使用增量(C 用位移位和增量实现减法,c,algorithm,bit-shift,C,Algorithm,Bit Shift,是否有一种算法可以用来从一个数字中减去1,只需使用增量(++在C中)和左位移位()就可以使用++操作符。循环进行UCHAR\u MAX迭代。虽然效率很低: unsigned char c = 42; unsigned char i = 0; while (++i) { ++c; } // c is now equal to 41 您只需使用++操作符即可完成此操作。UCHAR\u MAX迭代的循环。虽然效率很低: unsigned char c = 42; unsigned char
++
在C中)和左位移位()就可以使用++
操作符。循环进行UCHAR\u MAX
迭代。虽然效率很低:
unsigned char c = 42;
unsigned char i = 0;
while (++i)
{
++c;
}
// c is now equal to 41
您只需使用++
操作符即可完成此操作。UCHAR\u MAX
迭代的循环。虽然效率很低:
unsigned char c = 42;
unsigned char i = 0;
while (++i)
{
++c;
}
// c is now equal to 41
是。你需要接近一个数字n,使n mod 255
等于originalNumber-1
。最简单的方法是将255添加到你的数字中。这可以通过255个++运算符应用程序来实现,或者更智能地通过移位直到需要添加为止
按要求编辑:
unsigned char c = 77;
unsigned char i = 0;
if(c < 128)
{
i = c;
c = c << 1;
}
while(++i)
{
++c;
}
// c == 76
无符号字符c=77;
无符号字符i=0;
if(c<128)
{
i=c;
c=c是。您需要接近一个数字n,使n mod 255
等于originalNumber-1
。最简单的方法是将255添加到您的数字中。这可以通过255个++运算符应用程序来实现,或者更智能地通过移位直到需要添加为止
按要求编辑:
unsigned char c = 77;
unsigned char i = 0;
if(c < 128)
{
i = c;
c = c << 1;
}
while(++i)
{
++c;
}
// c == 76
无符号字符c=77;
无符号字符i=0;
if(c<128)
{
i=c;
c=c这也使用了+
,因此它不像Paul R的回答那样令人敬畏
unsigned char subtract_one(unsigned char value)
{
unsigned char addend= 0;
unsigned char old_addend;
do
{
old_addend= addend;
addend= addend << 1;
addend++;
}
while (old_addend!=addend); // stops when addend==-1;
return value + addend;
}
无符号字符减去一(无符号字符值)
{
无符号字符加数=0;
无符号字符旧加数;
做
{
旧加数=加数;
加数=加数这也使用了+
,因此它不像Paul R的答案那样令人敬畏
unsigned char subtract_one(unsigned char value)
{
unsigned char addend= 0;
unsigned char old_addend;
do
{
old_addend= addend;
addend= addend << 1;
addend++;
}
while (old_addend!=addend); // stops when addend==-1;
return value + addend;
}
无符号字符减去一(无符号字符值)
{
无符号字符加数=0;
无符号字符旧加数;
做
{
旧加数=加数;
addend=addend您也可以使用按位运算符实现加法,然后将其与其他两个解决方案组合,以获得不需要“+”运算符的解决方案:
function add(int a, int b) {
int x, y;
do {
x = a & b;
y = a ^ b;
a = x << 1;
b = y;
} while (a);
return b;
}
函数添加(int a,int b){
int x,y;
做{
x=a&b;
y=a^b;
a=x您也可以使用按位运算符实现加法,然后将其与其他2个解决方案组合,以获得不需要“+”运算符的解决方案:
function add(int a, int b) {
int x, y;
do {
x = a & b;
y = a ^ b;
a = x << 1;
b = y;
} while (a);
return b;
}
函数添加(int a,int b){
int x,y;
做{
x=a&b;
y=a^b;
a=x确定只使用适当实例化的无符号字符结果[1为什么要这样做?确定只使用适当实例化的无符号字符结果吗[1你为什么要这样做?你将如何使用移位来实现加法?@Paul R这是一个乘以2的运算。这是一个快捷方式。如果你的数字小于128,那么你至少可以移位一次,然后再进行迭代加法。我仍然不知道你如何将其转化为加法?乘法是的,但加法(通过常数)似乎不可能?(我想你可能是指nmod256
,而不是nmod255
)不,我的意思是n mod 255。算出数学。你需要某种计数器来检查你是否可以移动以减少加法。最坏的情况是1。你可以移动7次,而不是添加255次,达到128次。然后你保证最多只有127次加法。但是这需要额外的逻辑。这意味着你但是需要测试n的初始值,这是没有任何运算符的?如何只使用增量和移位来执行mod 255
?如何使用移位来实现加法?@Paul R这是一个乘以2的方法。这是一个快捷方式。如果你的数字小于128,那么你可以在生成结果之前至少移位一次到迭代加法。我还是不明白你是如何把它转换成加法的?乘法是的,但是加法(通过一个常数)似乎是不可能的?(我想你可能是指nmod 256
,而不是nmod 255
)不,我的意思是n mod 255。算出数学。你需要某种计数器来检查你是否可以移动以减少加法。最坏的情况是1。你可以移动7次,而不是添加255次,达到128次。然后你保证最多只有127次加法。但是这需要额外的逻辑。这意味着你但是需要测试n的初始值,你不能对其使用任何运算符?你将如何只使用增量和移位来执行mod 255
?在这种情况下,编译器将对其进行优化-这样就不会太低效,只需confusing@LorenzoBelli:如果添加UCHAR\u MAX
(通常为255)对于一个无符号字符
,由于模环绕,这与减去1是一样的。在这种情况下,编译器只需对其进行优化,这样就不会太低效,只需confusing@LorenzoBelli:如果将UCHAR_MAX
(通常为255)添加到无符号字符
,则由于模环绕,这与减去1相同。