[問題] uint32陣列每筆資料多一個bit當flag轉換
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
無
問題(Question):
在每一筆數據的第31bit加入flag,0表示後面還有元素,1表示後面沒有元素,
也就是最後一筆元素;
每一筆的0-30bit為數據,第31bit原本的資料會放到第二筆數據的bit0,
原本第二筆的數據0~29bit要做right shift
也就是原來第一筆數據的bit31跑到第二筆數據的的bit0,
原本第二筆數據的0-29bit變成1-30bit,第二筆的bit31仍為flag,
要設計出n個元素都能通用的函數
餵入的資料(Input):
unsigned int input_data[3] = {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF};
預期的正確結果(Expected Output):
unsigned int output_data[4] = {0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x80000007};
錯誤結果(Wrong Output):
最後一筆應為0x80000007
實際上跑出來是0x80000000
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// Define the flag bit value
#define FLAG_BIT 0x80000000
// Function to convert array of unsigned integers
unsigned int* convert_data(unsigned int* input_data, int len) {
// Allocate memory for the output data
unsigned int* output_data = (unsigned int*)malloc((len + 1) *
sizeof(unsigned int));
if (output_data == NULL) {
perror("Failed to allocate memory");
exit(EXIT_FAILURE);
}
// Convert each element
for (int i = 0; i < len; i++) {
// Extract the data part (lower 31 bits) of the current input element
unsigned int data = input_data[i] & 0x7FFFFFFF;
// Extract the flag bit of the current input element
unsigned int flag = (input_data[i] >> 31) & 0x1;
// Combine data and flag to form the output element
output_data[i] = data;
// Set the flag bit of the next element if this is not the last
element
if (i < len - 1) {
output_data[i + 1] = (flag << 31) | (output_data[i + 1] >> 1);
}
}
// Set the flag bit of the last element to indicate the end
output_data[len] = FLAG_BIT | (output_data[len] >> 1);
return output_data;
}
int main() {
unsigned int input_data[3] = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF};
int len = sizeof(input_data) / sizeof(input_data[0]);
// Convert the data
unsigned int* output_data = convert_data(input_data, len);
// Print the converted data
for (int i = 0; i < len + 1; i++) {
printf("output_data[%d] = 0x%08X\n", i, output_data[i]);
}
// Free the allocated memory
free(output_data);
return 0;
}
補充說明(Supplement):
或是有沒有現成的library可以做這件事?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.94.2 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1713177972.A.3E9.html
推
04/15 19:27,
7月前
, 1F
04/15 19:27, 1F
推
04/15 19:47,
7月前
, 2F
04/15 19:47, 2F
→
04/15 20:41,
7月前
, 3F
04/15 20:41, 3F
推
04/16 02:31,
7月前
, 4F
04/16 02:31, 4F
→
04/16 02:31,
7月前
, 5F
04/16 02:31, 5F
→
04/16 02:31,
7月前
, 6F
04/16 02:31, 6F
→
04/16 02:31,
7月前
, 7F
04/16 02:31, 7F
→
04/16 02:31,
7月前
, 8F
04/16 02:31, 8F
推
04/16 07:41,
7月前
, 9F
04/16 07:41, 9F
推
04/16 23:50,
7月前
, 10F
04/16 23:50, 10F
推
05/16 00:32,
6月前
, 11F
05/16 00:32, 11F
→
05/16 00:33,
6月前
, 12F
05/16 00:33, 12F
→
05/16 00:34,
6月前
, 13F
05/16 00:34, 13F
→
05/16 00:40,
6月前
, 14F
05/16 00:40, 14F
→
05/16 22:40,
6月前
, 15F
05/16 22:40, 15F
→
05/16 22:40,
6月前
, 16F
05/16 22:40, 16F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章