簡體   English   中英

c:指針-如何將每2個字節加X

[英]c: pointers - how to increase every 2nd byte by X

我有一個指針,其中包含100個字節的數據。 我想在第二個字節中加5。

例:

1 2 3 4 5 6

會變成:

1 7 3 9 5 11

現在我知道我可以進行for循環了,有沒有更快的方法? 像memset這樣的東西會增加每個第二字節的值?

謝謝

循環將是最好的方法。 memset()對於設置連續的內存塊非常有效。 在這里對您沒有太大幫助。

您使用哪種格式的字節? 作為串聯字符? 還是字節是uint32的子部分?

通常,循環是執行此操作的最佳方法-即使您能夠使用memset應用類似模式的掩碼,您仍然需要創建它,並且將花費相同數量的CPU周期。

如果每個元素有4個字節(例如uint32),則可以通過創建用於添加的預定義掩碼將CPU周期減少一半。 但是請注意:這樣的解決方案不會檢查溢出(偽代碼):

uint32* ptr = new uint32[16]; // creates 64 bytes of data
(...) fill data
for (int k=0; k < 16; ++k)
{
   // Hardcored Add-Mask for Little Endian systems
   ptr[k] += 0x05000500; // dereference and add mask to content
}

編輯:請注意,這假設一個小端系統,並且是C ++偽代碼。

如果memset支持增加第n個字節的值,您認為它將如何實現呢?

實際上,您可以使用循環展開來使其更快,但是您需要知道數組的大小是固定的。 然后,您只需重復分配值即可跳過循環開銷:

array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...

這樣,您就不會有循環中會出現的跳轉和測試指令所產生的開銷,但是您可以在代碼膨脹中為此付出代價。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM