本文概述
编写一个程序, 从给定的数字中减去一个。不允许使用" +", "-", " *", " /", " ++", " –"等运算符。
例子:
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 <stdio.h>
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
<?php
// PHP code to subtract
// one from a given number
function subtractOne( $x )
{
$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 Code
echo subtractOne(13);
// This code is contributed
// by anuj_67.
?>
输出如下:
12
方法2(如果允许+)
我们知道, 在大多数架构中, 负数都以2的补码形式表示。对于带符号的数字的2的补码表示, 我们具有以下引理。
假设x是数字的数值, 则
〜x =-(x + 1)[〜用于按位补码]
两侧加2倍,
2x +〜x = x – 1
要获得2x, 请向左移x一次。
C ++
#include <stdio.h>
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
<?php
function subtractOne( $x )
{
return (( $x << 1) + (~ $x ));
}
/* Driver code*/
print (subtractOne(13));
// This code has been contributed by mits
?>
输出如下:
12