Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用位移位和增量实现减法_C_Algorithm_Bit Shift - Fatal编程技术网

C 用位移位和增量实现减法

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

是否有一种算法可以用来从一个数字中减去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 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相同。