📜  没有算术运算运算符的减法1

📅  最后修改于: 2021-04-23 22:13:14             🧑  作者: Mango

编写一个程序,从给定的数字中减去一个。不允许使用“ +”,“-”,“ *”,“ /”,“ ++”,“ –”等运算符。
例子:

Input:  12
Output: 11

Input:  6
Output: 5

方法1
要从数字x中减去1(例如0011001000),请翻转最右边1位之后的所有位(我们得到001100 1 111)。最后,也将最右边的1位翻转(我们得到0011000111)以得到答案。

C
// C code to subtract
// one from a given number
#include 
 
int subtractOne(int x)
{
    int m = 1;
 
    // Flip all the set bits
    // until we find a 1
    while (!(x & m)) {
        x = x ^ m;
        m <<= 1;
    }
 
    // flip the rightmost 1 bit
    x = x ^ m;
    return x;
}
 
/* Driver program to test above functions*/
int main()
{
    printf("%d", subtractOne(13));
    return 0;
}


Java
// Java code to subtract
// one from a given number
import java.io.*;
 
class GFG
{
static int subtractOne(int x)
{
    int m = 1;
 
    // Flip all the set bits
    // until we find a 1
    while (!((x & m) > 0))
    {
        x = x ^ m;
        m <<= 1;
    }
 
    // flip the rightmost
    // 1 bit
    x = x ^ m;
    return x;
}
 
// Driver Code
public static void main (String[] args)
{
    System.out.println(subtractOne(13));
}
}
 
// This code is contributed
// by anuj_67.


Python3
# Python 3 code to subtract one from
# a given number
def subtractOne(x):
    m = 1
 
    # Flip all the set bits
    # until we find a 1
    while ((x & m) == False):
        x = x ^ m
        m = m << 1
     
    # flip the rightmost 1 bit
    x = x ^ m
    return x
 
# Driver Code
if __name__ == '__main__':
    print(subtractOne(13))
     
# This code is contributed by
# Surendra_Gangwar


C#
// C# code to subtract
// one from a given number
using System;
 
class GFG
{
static int subtractOne(int x)
{
    int m = 1;
 
    // Flip all the set bits
    // until we find a 1
    while (!((x & m) > 0))
    {
        x = x ^ m;
        m <<= 1;
    }
 
    // flip the rightmost
    // 1 bit
    x = x ^ m;
    return x;
}
 
// Driver Code
public static void Main ()
{
    Console.WriteLine(subtractOne(13));
}
}
 
// This code is contributed
// by anuj_67.


PHP


Javascript


C++
#include 
 
int subtractOne(int x)
{
    return ((x << 1) + (~x));
}
 
/* Driver program to test above functions*/
int main()
{
    printf("%d", subtractOne(13));
    return 0;
}


Java
class GFG
{
 
    static int subtractOne(int x)
    {
        return ((x << 1) + (~x));
    }
 
    /* Driver code*/
    public static void main(String[] args)
    {
        System.out.printf("%d", subtractOne(13));
    }
}
 
// This code has been contributed by 29AjayKumar


Python3
def subtractOne(x):
 
    return ((x << 1) + (~x));
 
# Driver code
print(subtractOne(13));
 
# This code is contributed by mits


C#
using System;
     
class GFG
{
 
    static int subtractOne(int x)
    {
        return ((x << 1) + (~x));
    }
 
    /* Driver code*/
    public static void Main(String[] args)
    {
        Console.Write("{0}", subtractOne(13));
    }
}
 
// This code contributed by Rajput-Ji


PHP


Javascript


输出:
12

方法2(如果允许+)
我们知道,在大多数体系结构中,负数均以2的补码形式表示。对于符号数的2的补码表示,我们具有以下引理成立。
假设x是数字的数值,则
〜x =-(x + 1)[〜用于按位补码]
两侧加2倍,
2x +〜x = x – 1
要获得2倍,请左移x一次。

C++

#include 
 
int subtractOne(int x)
{
    return ((x << 1) + (~x));
}
 
/* Driver program to test above functions*/
int main()
{
    printf("%d", subtractOne(13));
    return 0;
}

Java

class GFG
{
 
    static int subtractOne(int x)
    {
        return ((x << 1) + (~x));
    }
 
    /* Driver code*/
    public static void main(String[] args)
    {
        System.out.printf("%d", subtractOne(13));
    }
}
 
// This code has been contributed by 29AjayKumar

Python3

def subtractOne(x):
 
    return ((x << 1) + (~x));
 
# Driver code
print(subtractOne(13));
 
# This code is contributed by mits

C#

using System;
     
class GFG
{
 
    static int subtractOne(int x)
    {
        return ((x << 1) + (~x));
    }
 
    /* Driver code*/
    public static void Main(String[] args)
    {
        Console.Write("{0}", subtractOne(13));
    }
}
 
// This code contributed by Rajput-Ji

的PHP


Java脚本


输出:
12