能力值:
( LV3,RANK:20 )
|
-
-
2 楼
移位指令在C++裡的寫法:
int n = 100; // 01100100
// 01100100 shift left 1 bit is 11001000
int m = n << 1; // 11001000
// 01100100 shift right 2 bits is 00011001
int p = n >> 2; // 00011001
結果(十進位):
n: 100
m: 200
p: 25
至於無條件跳轉的話,一般高級語言是不建議使用這個的。
在C++裡,無條件跳轉是用goto,我在這裡舉個例子。
bool myfunc(void)
{
bool result = false;
FILE* f = fopen("test.txt", "rt");
if ( ... ) goto onexit;
// some code here
if ( ... ) goto onexit;
// some code here
result = true;
onexit: // 這裡放一個Label
fclose(f);
return result;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
======================================
先谢谢了
这书写格式看出来就是爽
但我想在问一句:什么时间才需要用到
假设我现在会所有的语言,我想用 C++ 写一个程序,在编写什么的时候才需要用到这个指令
这样写可能有点糊
例如:ADD
当我的编程时,想用 100+100 的时候就会用到了
但移位指令是编程的什么时候会用到,希望高人解释解释
(不理解的话,就相当于死记硬背,死记硬背就没发贯通了)
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
不知道楼主看过王爽的那本《汇编语言》没有,感觉说的比较详细、易懂
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
================================
哦!!!
无条件跳转 原来是用在判断语句上的啊。。。
非常感谢
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不好意思 。。没有
我入手的就是中山的
有时间我会看看的,也谢谢你的帮助
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
我上一次看見bit shift是在一個叫作Local Binary Pattern(LBP)的演算法裡。
所以我在這裡也用它來舉個例子。
假設,對於灰階像素X有八個相鄰的像素,分別是A~H,如下所示:
A H G
B X F
C D E
我們將這八個相鄰的像素A~H與中間的像素X做比較,
如果相鄰像素比X大的話,則用1來表示,否則為0。
舉例,X為5,A~H分別為1~8的話:
1 8 7
2 5 6
3 4 5
運算後會得到:
0 1 1
0 X 1
0 0 0
如此A~Z分別為 0 0 0 0 0 1 1 1,因為正好是八個位元,
所以可以把它當成是一個8bit的整數,像這個00000111就是7。
我們可以舉其他例子,比如結果可能會是01110000(十進位是112):
0 0 0
1 X 0
1 1 0
或者00001110(十進位是14):
0 0 1
0 X 1
0 0 1
我這裡想說的是,在LBP的論文中,認為不管是00000111、
01110000或者00001110所代表的義意是相同的:它們具有相同的紋理。
所以論文裡做了一個步驟:shift(loop)直到最小。
比如說,00000111、01110000、00001110都會得到00000111這個結果。
ps. 0~255所有數字都shift到最小的話,好像會剩下36組數字。
因為懶得再舉例,所以直接把我寫過程式碼的一段貼上來:
/* calculate LBP */
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
double* tempaddr = &temp[(left + x) * tempHeight + (top + y)];
uint8_t& outval = output[x * height + y] = 0;
for (int i = 0; i < 8; i++) // compare width center
{
outval <<= 1;
if (tempaddr[offset[i]] > tempaddr[0]) outval |= 1;
}
uint8_t rotate = outval;
for (int i = 0; i < 7; i++) // rotate to minimum
{
rotate = uint8_t(rotate << 1) | uint8_t(rotate >> 7);
if (rotate < outval) outval = rotate;
}
}
}
|
能力值:
( LV5,RANK:70 )
|
-
-
8 楼
楼上大侠说得很清楚好~~不过,我建议你不要管这么多,因为我都是代码需要了,才发现用处。例如goto,其实是万能跳~只是不建议这样做而已。
还有在while ,for ,do ,while ,switch 里,都有jmp(编译器决定)
位移,很多时候是用来加密、解密的,但是不止能这么用,我们要提取几个特定的bit,会用到位移(LOWORD,GET_X_PARAM...)
……特别好玩的是,(m左移n位)等于(m×2^n),(m右移n位)等于(m÷2^n),听说这样算能比直接乘除快很多倍~
|
|
|