LINUX.ORG.RU

как реализовать некую часть алгоритма

 битовые операции


0

1

Привет всем.
Появилась у меня необходимость реализовать интересную задачку, но для этого нужна ваша помощь.
Как с помощью операторов языков java, или с (на крайний случай на асм), реализовать следуйщее:
К примеру, есть койнить целочисловой тип, младший байт в нем - (пример) 11110000. В нем нужно биты 3-7 сдвинуть на 1 влево, 0-2 оставить на месте, а 3 бит установить самостоятельно.
У кого какие предложения есть на эту тему?
Да, и не хочется делать это очень велосипедным способом...


Считай до нужного и верти его, либо запоминай положение и значение нужных и двигай с выравниванием.

blogdron
()
Ответ на: комментарий от blogdron

Ой тебе же жава нужна не знаю как на ней, а на сишке элементарно.

blogdron
()

B - наш байт, N - устанавливаемое значение бита 3, тогда:

R = ((B & 0xF8) << 1) & 0xFF | (B & 7) | (N & 1) << 3;

blexey ★★★★★
()
Ответ на: комментарий от blogdron

Сдвиг с выравниааем это как?

Считай до нужного и верти его

т.е. циклом пройтись по всему байту и с каждым битом работать отдельно, или я не так недопонял?

brut
() автор топика

тебе помогут два оператора << и &

чтото примерно следующее ((a & 11111000) << 1) & (a & 00000111) & 11110111 & (x ? 00001000 : 00000000)

mm3 ★★★
()
Ответ на: комментарий от blexey

Впринципе идея ясна, спасибо. В уме все сразу просчитать не так уж легко, доберусь до пк - буду пробовать.

brut
() автор топика
Ответ на: комментарий от mm3

Не плохая идея, вроде бы все елементарно.

brut
() автор топика
Ответ на: комментарий от blexey

0_о, кстати, привет, земляк!)
ЦИС у нас был, или как там?

brut
() автор топика
Ответ на: комментарий от nanoolinux

Да вроде бы все и понятно, и ничего сложного нету, просто тежело сразу сасому подумать и довести это до толку..

brut
() автор топика
Ответ на: комментарий от brut

Небось, ещё такого не видел?

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char** argv){
    (void)argc;(void)argv;

    printf("%c %c\n","zxcv"[3],3["zxcv"]);

    return EXIT_SUCCESS;}

anonymous
()

Сдвиг и маски решат все ваши проболемы.

trex6 ★★★★★
()

Все оказалось проще чем я думал.

brut
() автор топика

сплошной непроходимый линукс

anonymous
()

a - четырехбайтная переменная

mov eax,a
mov cl,7
and cl,al
shl al,1
or al,cl
bts ax,3 ; btr ax,3 -если нужно установить 3й бит в 0
mov a,eax

Taetricus
()
Ответ на: комментарий от Taetricus

Немного не так я написал.
a - любая переменная

mov al,byte [a]
mov cl,7
and cl,al
shl al,1
or al,cl
bts ax,3 ; btr ax,3 -если нужно установить 3й бит в 0
mov byte [a],al

Taetricus
()
Ответ на: комментарий от nanoolinux

bts, sar, and. ну и mov ещё. нужно два регистра и будет быстрее, чем на с.

4.2

проверь, и признайся, что ты позорно слил компилятору.

drBatty ★★
()
Ответ на: комментарий от AptGet

1 во всех разрядах. удобно, когда маски большие

это всегда удобно, ибо размер числа в C неизвестен на этапе компиляции.

drBatty ★★
()
Ответ на: комментарий от Taetricus

Что-то туплю сегодня по полной.

mov al,byte [a]
mov cl,7
and cl,al
shl al,1
and al,240
or al,cl
bts ax,3 ;если нужно установить 3й бит в 1, если в 0 то эту строку убрать.
mov byte [a],al

Taetricus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.