我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......
我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.
由同事作为一个谜题,我无法弄清楚这个C程序实际上是如何编译和运行的.什么是这个>>>=运算符和奇怪的1P1文字?我在Clang和GCC进行了测试.没有警告,输出是"???"
#include <stdio.h>
int main()
{
int a[2]={ 10, 1 };
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 例如,可以使用位运算符来实现乘法和除法
i*2 = i<<1
i*3 = (i<<1) + i;
i*10 = (i<<3) + (i<<1)
Run Code Online (Sandbox Code Playgroud)
等等.
实际上使用say (i<<3)+(i<<1)乘以10比i*10直接使用更快吗?是否有任何类型的输入不能以这种方式倍增或分割?
我发现这个怪异:
for (long l = 4946144450195624l; l > 0; l >>= 5)
System.out.print((char) (((l & 31 | 64) % 95) + 32));
Run Code Online (Sandbox Code Playgroud)
输出:
hello world
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
我正在查看sorted_containers的来源,并惊讶地看到这一行:
self._load, self._twice, self._half = load, load * 2, load >> 1
Run Code Online (Sandbox Code Playgroud)
这load是一个整数.为什么在一个地方使用位移,在另一个地方使用乘法?似乎合理的是,位移可能比积分除以2更快,但为什么不用乘法替换乘法呢?我对以下案例进行了基准测试:
并发现#3始终比其他替代品更快:
# self._load, self._twice, self._half = load, load * 2, load >> 1
import random
import timeit
import pandas as pd
x = random.randint(10 ** 3, 10 ** 6)
def test_naive():
a, b, c = x, 2 * x, x // 2
def test_shift():
a, b, c = x, x << 1, x >> 1
def test_mixed(): …Run Code Online (Sandbox Code Playgroud) 我正在查看Mozilla的代码,它为Array添加了一个过滤方法,它有一行代码让我很困惑.
var len = this.length >>> 0;
Run Code Online (Sandbox Code Playgroud)
我以前从未见过用于JavaScript的>>>.
它是什么,它做了什么?
我试图了解班次运营商,并没有得到太多.当我尝试执行以下代码时
System.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
1000000000000
100000000000000000000000
100
10000000000000
1000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
在C中,移位运算符(<<,>>)是算术还是逻辑?
您是否曾经在实际编程项目中使用位移?大多数(如果不是全部)高级语言都有移位运算符,但什么时候你真的需要使用它们?
bit-shift ×10
c ×3
java ×3
operators ×2
binary ×1
c++ ×1
digraphs ×1
division ×1
javascript ×1
literals ×1
long-integer ×1
obfuscation ×1
performance ×1
python ×1
python-3.x ×1
string ×1