廢話少說,上**;
#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...