如何在C中访问给定字节的特定位?
例如,假设我有类似“0000 0000 1110”的内容如何在C中访问给定字节的特定位?,c,binary,byte,bits,C,Binary,Byte,Bits,例如,假设我有类似“0000 0000 1110”的内容 如何访问最左边的1并将其更改为0?我想您正在寻找 例如: 00011001 >> 3 = 00000011 现在用1掩盖它 00000011 & 00000001 = 00000001 代码:- int funcBitMasking(int8_t mybyte, int firstbit) { if (firstbit> 0 && firstbit<= 16) r
如何访问最左边的1并将其更改为0?我想您正在寻找 例如:
00011001 >> 3 = 00000011
现在用1掩盖它
00000011 & 00000001 = 00000001
代码:-
int funcBitMasking(int8_t mybyte, int firstbit)
{
if (firstbit> 0 && firstbit<= 16)
return (mybyte & (1<<(firstbit-1)));
else
return 0;
}
int funcBitMasking(int8\t mybyte,int firstbit)
{
如果(firstbit>0&&firstbit使用按位And(&)。例如0000 0000 1110&0000 0000 1000将给出非零答案我假设您的输入是32位。我们扫描输入的第一个1,左移;通过&
使用0X7FFF
将第一位更改为0,并按左移+1的数字右移
unsigned int i = 0XE;
int j;
for ( j = 0; j < 32 && ! ( i & 0X8000 ); j++ )
i <<= 1;
i &= 0X7FFF;
i >>= ( j + 1 );
无符号整数i=0XE;
int j;
对于(j=0;j<32&&!(i&0X8000);j++)
i=(j+1);
假设a=0000 1110
int i =16 ;
b = 1;
while(true)
{
b = b << 1 ;
if(b & 0x1000000000000000)
{
break;
}
i = i +1 ;
}
我想你提到的是右手边的第四个位子是最左边的位子
要访问特定位,可以使用移位运算符
如果要重置的总是1
,则可以使用&
操作
但是,如果它也可以取0
值,那么&
操作将失败,因为0&1=0
。在此期间,您可以使用|(或)
将此值存储在变量中,并使用(1执行或操作。这两个函数可以处理64位值
uint8_t get_bit(uint64_t bits, uint8_t pos)
{
return (bits >> pos) & 0x01;
}
uint64_t set_bit(uint64_t bits, uint8_t pos, uint8_t value)
{
uint64_t mask = 1LL << (63 - pos);
if (value)
bits |= mask;
else
bits &= ~mask;
return bits;
}
uint64_t v = ...;
uint8_t i = 63;
for(;i>=0; i--)
{
if(get_bit(v, i)){
v=set_bit(v,i, 0);
break;
}
}
uint8获取位(uint64位,uint8位)
{
返回(位>>位置)&0x01;
}
uint64设置位(uint64位、uint8位、uint8位值)
{
uint64\u t掩码=1LL=0;i--)
{
if(获取位(v,i)){
v=设置位(v,i,0);
打破
}
}
#包括
#包括
int mlb_pos(uint16_t x){//0原点
uint16_t y;
int n=16;
如果(y!=0){n=n-8;x=y;}
如果(y!=0){n=n-4;x=y;}
如果(y!=0){n=n-2;x=y;}
y=x>>1;如果(y!=0){返回15-(n-2);}
返回15-(n-x);
}
int main(){
uint16\u t n=14;//0b0000000000001110
uint16_t result=n^(1一般来说,对于像这样的位旋转黑客,请查阅。一行代码以获取设置为1的msb:i=floor(log(bits)/log(2))
uint8_t get_bit(uint64_t bits, uint8_t pos)
{
return (bits >> pos) & 0x01;
}
uint64_t set_bit(uint64_t bits, uint8_t pos, uint8_t value)
{
uint64_t mask = 1LL << (63 - pos);
if (value)
bits |= mask;
else
bits &= ~mask;
return bits;
}
uint64_t v = ...;
uint8_t i = 63;
for(;i>=0; i--)
{
if(get_bit(v, i)){
v=set_bit(v,i, 0);
break;
}
}
#include <stdio.h>
#include <stdint.h>
int mlb_pos(uint16_t x) {//0 origin
uint16_t y;
int n = 16;
y = x >> 8; if (y != 0){ n = n - 8 ; x = y; }
y = x >> 4; if (y != 0){ n = n - 4 ; x = y; }
y = x >> 2; if (y != 0){ n = n - 2 ; x = y; }
y = x >> 1; if (y != 0){ return 15-(n-2); }
return 15-(n-x);
}
int main(){
uint16_t n = 14;//0b0000000000001110
uint16_t result = n ^ (1<<mlb_pos(n));
printf("%d\n", result);//6 : 0b0000000000000110
}