陣列中按起始位進行讀寫值

2021-08-15 04:20:26 字數 2637 閱讀 9151

廢話少說,上**;

#include

#include

#include

#include

#define def_val     0xffffff

// 為什麼是 ffffff, 不是 ffffffff

#define rd_max      3

#define short_bit_len 16

#define char_bit_len  8

//測試的 buf  

uint8_t key_val = ;

typedef struct

key_site_t;

typedef struct

conver_info_t;

void debug_key(uint8_t *buf, uint16_t len)

printf("\r\n------------------------\r\n");

}int dev_cnv_info_get(conver_info_t *info, key_site_t *site)

info->end_mask  = ((site->end_bit + 1) & 7);

printf("index:%d ,start_mask:%d ,end_mask:%d optlen:%d \r\n",

info->index, info->start_mask, info->end_mask, info->optlen);

a = def_val << info->start_mask;//通過左移 來清除低位bit 的值;左移,低位補0; 

if(info->end_mask != 0)

b = def_val >> (char_bit_len - info->end_mask);// 右移,清除end_bit 對應byte 的高bit的值 ,高bit 補0 

printf("a:%08x, b:%08x \r\n",a, b);

b >>= ((rd_max - info->optlen) << 3);// 右移 幾個位元組對應的bit; val,每次讀3byte

printf("after move , b:%08x \r\n", b);

info->opt_val = (a & b);//  a & b 後, 相當於把 低位和高位都清0了,只保留了 start_bit 和 end_bit 中間bit 全為1, 後面可進行 &操作 或者取反後,進行| 

printf("opt_val:%08x \r\n",info->opt_val);

return 0;

}int dev_get_data_by_site(key_site_t *site, uint8_t *input, uint16_t maxsize, uint16_t *get_val)

int dev_set_data_by_site(key_site_t *site, uint8_t *input, uint16_t maxsize, uint16_t set_val)

int main(int argc, char *argv)

site.start_bit = atoi(argv[1]);

printf("start_bit:%d \r\n",site.start_bit);

site.end_bit = atoi(argv[2]);

printf("end_bit:%d \r\n",site.end_bit);

set_val = atoi(argv[3]);

dev_get_data_by_site(&site, key_val, sizeof(key_val),&get_val);

printf("get_the old val: %d \r\n",get_val);

printf("set_val:%x \r\n",set_val);

printf("******debug buf before set_val ******\r\n");    

debug_key(key_val, sizeof(key_val));

dev_set_data_by_site(&site, key_val, sizeof(key_val),set_val);

printf("******debug buf after set_val ******\r\n");

debug_key(key_val, sizeof(key_val)); 

dev_get_data_by_site(&site, key_val, sizeof(key_val),&get_val);

printf("get_val: %d \r\n",get_val);

return 0;

}makefile

cc = cc

ar = ar

ar_flag = rcs 

srcs = $(wildcard *.c)

target = shift

all:$(target)

@echo "build $(target)"

$(target):$(srcs)

$(cc) -g -wall -o $@ $(srcs) 

clean:

@echo "clean $(target)"

@rm -f $(target)

至於測試。。。。,你懂得。。,不多說。

java中按位運算

一 位與 對應的二進位制位進行與操作,兩個都為1才為1,其他情況均為0 測試 system.out.println 5 6 列印 4 過程 5表示成 0000 0000 0000 0000 0000 0000 0000 0101 6表示成 0000 0000 0000 0000 0000 0000 ...

python 中按原碼取反 按位取反

在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...

基於陣列的位運算4 位陣列按bit位整體移動

對於memmove,memcpy等c語言記憶體操作函式你一定很熟悉吧,如果不知道,just go search 廢話少說直接進入話題.給你乙個函式 static void shiftbittolow uchar bitarray,const uint bitleng,uint leftbitshif...