在c语言中,如何不用算术运算符将给定的数字乘以2?

在c语言中,如何不用算术运算符将给定的数字乘以2?,c,C,如何在不使用c语言算术运算符的情况下将给定的数字乘以2?使用按位左移位 ??将这种优化留给编译器进行 操作员列表和大量示例 仅在kgiannakakis post上扩展: 移位运算符警告:移位可能不适用于有符号变量 int x; int tmp; if (x < 0) { tmp = -x; tmp = tmp << 1; x = -tmp; } else { x = x << 1; } intx; int tmp; if(x

如何在不使用c语言算术运算符的情况下将给定的数字乘以2?

使用按位左移位

??将这种优化留给编译器进行


操作员列表和大量示例

仅在kgiannakakis post上扩展:


移位运算符
警告:移位可能不适用于有符号变量

int x;
int tmp;

if (x < 0) {

   tmp = -x;
   tmp = tmp << 1;
   x = -tmp;
}
else {

   x = x << 1;
}
intx;
int tmp;
if(x<0){
tmp=-x;

tmp=tmp为了确保大家都清楚,按照大家的建议,按位向左移位(用你自己的语言阅读二进制。二进制中2是“10”,3是“11”。所以在二进制中,3*2=6是这样写的:11*10=110,与左移位相同。“还有长数字”--什么?长数据类型不是整数类型吗?事实上你是对的。我的意思是它适用于int和long数据类型,它们都是整数。该标记是在我的答案之后添加的,但即使对于家庭作业来说,指出这不是高级语言中进行乘法的正确方法也是一个好主意。通常,如果你正在处理有符号变量,您希望清楚地知道自己在做什么,通常应该避免位操作。如果我必须使用移位进行乘法,我可能会将符号位保留为单独的字符,并确保将其放回。或者将其写入纯汇编并滥用进位标志。通常-ve数字存储在大小写移位应该可以很好地工作并保留符号位。溢出仍然存在问题,但直乘法也是如此。
23 (move to left one digit) = 230 = 23 * 10
    3 * 2 = 6
0b11 << 1 = 0b110
   3 * 8 =    3 * 2^3    = 24
0b11 * 8 =   0b11 << 3   = 0b11000 (note the trailing zeros)
23 (move to left 3 places) = 23 * 1000 = 23 * 10^3 = 23000
int x;
int tmp;

if (x < 0) {

   tmp = -x;
   tmp = tmp << 1;
   x = -tmp;
}
else {

   x = x << 1;
}
int x;
int result;
x = 5;

// result = 10 (multiply by a factor of 2 or 2^1=2)
result = 5<<1;

//result = 20 (multiply by a factor of 4 or 2^2=4)
result = 5<<2;

//result = 40 (multiply by a factor of 8 or 2^3=8)
result = 5<<3;