左右移位运算符(<<和>>)已在C++中可用.但是,我无法找到如何执行循环移位或旋转操作.
如何执行"向左旋转"和"向右旋转"等操作?
在这里向右旋转两次
Initial --> 1000 0011 0100 0010
Run Code Online (Sandbox Code Playgroud)
应该导致:
Final --> 1010 0000 1101 0000
Run Code Online (Sandbox Code Playgroud)
一个例子会有所帮助.
(编者注:如果旋转计数为零,许多常见的表达方式在C中旋转会受到未定义的行为的影响,或者编译为不止一个旋转机器指令.这个问题的答案应记录最佳实践.)
当我编写以下程序并使用GNU C++编译器时,1我认为输出是由编译器执行的旋转操作引起的.
#include <iostream>
int main()
{
int a = 1;
std::cout << (a << 32) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但从逻辑上讲,正如所说的那样,如果位溢出位宽就会丢失,输出应为0.发生了什么?
代码在ideone上,http: //ideone.com/VPTwj .
我在leetcode中做了这个问题。
请求:
计算两个整数a和b的总和,但不允许使用+和-运算符。
我不明白它提供的解决方案
有人可以解释一下此getSum功能的工作原理吗?
这是JS中的答案:
var getSum=function(a,b) {
const Sum = a^b; //I can't understand how those two line's code can
const carry = (a & b) << 1; //get the sum
if(!carry) {
return Sum
}
return getSum(Sum,carry);
};
console.log(getSum(5,1));Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用二进制加法器的逻辑Sum = a XOR b和Carry = a AND b
我也有一个解决方案:
int add(int a, int b)
{
if(b == 0)
return sum;
sum = a ^ b;
carry = (a & b) << 1;
return add(sum,carry);
}
Run Code Online (Sandbox Code Playgroud)
我在这里不明白的是为什么在每次递归期间进位位移位或乘以2?
这是昨天我的问题的后续行动:
CMS慷慨地提供了使用按位运算符在C中添加两个数字的示例:
#include<stdio.h>
int add(int x, int y) {
int a, b;
do {
a = x & y;
b = x ^ y;
x = a << 1;
y = b;
} while (a);
return b;
}
int main( void ){
printf( "6 + 3 = %d", add(6,3));
printf( "6 - 3 = %d", add(6,-3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,然后我将它移植到Python,如下所示:
def add(x, y):
while True:
a = x & y
b = x ^ y
x = a …Run Code Online (Sandbox Code Playgroud) 这是在不使用运算符的情况下执行加法的求和逻辑,+如下所示,
int add(int a, int b) {
const char *c=0;
return &(&c[a])[b];
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以让我理解如何return声明如何添加a&b.
我看到了一个"谜题",你必须在C中编写一个返回值的函数a+c,但是,你不能使用+运算符.
unsigned f(unsigned a, unsigned c) {
return <write your coe here>;
}
Run Code Online (Sandbox Code Playgroud)
您只能使用以下字符:harc()&|[]*/.
int add(int a, int b)
{
return (int)&(((char *)a)[b]);
}
Run Code Online (Sandbox Code Playgroud)
我为什么要投a一个char *而不是int *?
我试图完全理解这段代码,但我不能,所以如果你很容易,请提供一个简单的英文解释.