数据类型为char,模式如下:
源字节:[0] [1] [2] [3] [4] [5] [6] [7]
目的地:[6] [7] [4] [5] [2] [3] [0] [1]
例如,如果我将char,29传递给此函数,它将进行交换并返回一个char类型值,即116.
如何进行交换?
谢谢。========================
只是想知道我是否可以这样做?
unsigned char mask = 128;
char num = 0, value1 = 29;
int i, a;
for(i = 0; i < 8; i++) {
if (i == 0 || i == 1 || i == 6 || i == 7)
a = 6;
else
a = 2;
if(i < 4)
num = ((value1 & mask) >> a);
else
num = ((value1 & mask) << a);
result = (result | num);
if(i<7)
mask = mask >> 1;
}
答案 0 :(得分:5)
我通常以另一种方式对我的位进行编号 - 因此位0是LSB。按照你的编号方案:
unsigned char src = 29;
unsigned char dst = 0;
dst = (((src & 0x80) >> 6) | // bit 0
((src & 0x40) >> 6) | // bit 1
((src & 0x20) >> 2) | // bit 2
((src & 0x10) >> 2) | // bit 3
((src & 0x08) << 2) | // bit 4
((src & 0x04) << 2) | // bit 5
((src & 0x02) << 6) | // bit 6
((src & 0x01) << 6) // bit 7
);
当然,除非您以“正确的方式”对它们进行编号,而是将它们“向后” - 然后反转我上面所做的。 (不是说我想在这里开始宗教战争......)
答案 1 :(得分:4)
或查找表
万一你不明白。这里有更多细节
对于256个可能的输入中的每一个输出答案(手动)
然后做
unsigned char answers[256] = {0x00, 0x40,0x21.....};
unsigned char answer = answers[input];
我必须补充一点,我给出的值是一个例子 - 当然不正确
答案 2 :(得分:3)
请参阅Bit Twiddling Hacks上的“转换位序列”部分。
另外,如果你想自己做:
要读取 n 位:int bit = value & (1 << n);
如果未设置该位,则bit
为0.
设置 n 位:value |= 1 << n;
(值=值OR(1位移n位))
清除 n 位:value &= ~(1 << n);
(值=值AND NOT(1位移n位))
答案 3 :(得分:1)
首先用低4位交换低4位,然后交换所有相邻位对:
dst = src;
dst = ((dst & 0xF0) >> 4) | ((dst & 0x0F) << 4);
dst = ((dst & 0xCC) >> 2) | ((dst & 0x33) << 2);
答案 4 :(得分:0)
您可能会觉得这很有用:
http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious
但它有点反转并不完全符合你的需要。只需要做一点工作就可以改变“显而易见”的算法来做你想做的事。
答案 5 :(得分:0)
通过随身携带http://en.wikipedia.org/wiki/Bitwise_operation#Rotate_through_carry
所以这会奏效:
myByte = myByte << 2 | myByte >> 6;
答案 6 :(得分:0)
source byte: [01][23][45][67] to
destination: [67][45][23][01]
实现:
unsigned char shiftit( unsigned char in ) {
unsigned char out;
out = (
(( in & 0xC0 ) >> 6) + /* top 2 to bottom 2 */
(( in & 0x30 ) >> 2) + /* centre-left 2 to centre-right */
(( in & 0x0C ) << 2) + /* centre-right 2 to centre-left */
(( in & 0x03 ) << 6) /* bottom 2 to top 2 */
);
return( out );
}
调用shiftit( 29 )
时返回116。